مدل ها در جنگو

آشنایی و کار با مدل ها در جنگو

6 ديدگاه

مدل ها در جنگو

سلام و عرض ادب خدمت کاربران سایت پایتونز، در این مطلب می خواهیم درباره مدل ها در جنگو صحبت کنیم لطفا با ما همراه باشید.

تو این قسمت از سری آموزش های جنگو  سراغ مدل ها میریم و نحوه کار با اون ها رو توضیح میدیم.

همه ی وب سایت ها برای برآورده کردن نیازهای کاربران نیاز دارن تا با پایگاه داده در تعامل باشند.

برای مثال نیاز دارن تا یه اطلاعاتی رو از کاربر بگیرن و ذخیره کنند یا اینکه یه اطلاعاتی رو از پایگاه داده بردارن و به کاربر نشون بدن.

تو جنگو مدل ها وظیفه کار با دیتابیس رو بر عهده دارن و به عنوان یک رابط بین پایگاه داده و وب اپلیکیشن شما عمل می کنند.

تو جنگو هر مدل یک جدول تو دیتابیس ما ایجاد میکنه .

هر مدل تعدادی متغیر داخلش داره که فیلدهای جدول هستند و اطلاعات مورد نیاز ما داخل اون ها ذخیره میشن.

هر مدل جنگو به صورت یک کلاس پایتون نوشته میشه که از زیر کلاس django.db.models.Model ارث بری میکنه

و اینجوری جنگو اون کلاس رو به عنوان یک مدل میشناسه.

تغییر دیتابیس در جنگو

تو جنگو به صورت پیش فرض از دیتابیس sqlite برای ذخیره اطلاعات شما استفاده میشه ولی اگه شما خواستید میتونید از فایل settings.py دیتابیس پیش فرض رو تغییر بدید و از دیتابیس های دیگه مثل mysql ، sql ، postgresql یا هر دیتابیس سازگار دیگه ای استفاده کنید. برای مثال اگر خواستید از دیتابیس postgresql استفاده کنید باید قسمت DATABASE در داخل فایل settings.py رو به شکل زیر تغییر بدید :

مدل ها در جنگو

اینجا باید اسم دیتابیس، رمز عبور ، یوزر دیتابیس و پورت دیتابیس خودتون رو وارد کنید تا اون دیتابیس به عنوان دیتابیس پیش فرض شما انتخاب بشه.

یک مثال ساده

پس از اینکه دیتابیس پیش فرضمون مشخص شد، به سراغ مدل ها میریم و نحوه ایجاد یک مدل رو توضیح میدیم. مدل های هر اپلیکیشن جنگو در داخل فایل models.py که داخل پوشه اپ وجود داره نوشتن میشن. برای مثال به کد زیر که یه مدل جنگو رو نشون میده توجه کنید :

 

from django.db import models

class person(models.Model):

first_name = models.CharField(max_length=30, null = True)

last_name = models.CharField(max_length=30)

این کد دقیقا معادل کد زیر در sql هستش :

 

CREAT TABLE myapp_person

("id" serial NOT NULL PRIMARY KEY,

"first_name" varchar(30) NOT NULL,

"last_name" varchar(30) NOT NULL

)

این کد به جنگو میگه که یک جدول با نام person در دیتابیس ایجاد کن که دو ستون با نام های first_name و last_name داره که حداکثر طول اون ها میتونه ۳۰ کاراکتر باشه و همچنین فیلد first_name میتونه null باشه. فیلد id هم به این دلیل تو sql اضافه شده که اگر تو مدل ما فیلدی رو به عنوان کلید اصلی جدول تعریف نکنیم، جنگو یک فیلد با نام id به جدول ما اضافه میکنه و اون رو به عنوان کلیدی اصلی جدول در نظر میگیره.

یک مثال پیچیده تر

خب حالا بیاید به سراغ یه مثال پیچیده تر بریم. به کد زیر توجه کنید :

 

from django.db import models

class musician(models.Model):

first_name = models.CharField(max_length=50)

last_name = models.CharField(max_length=100)

instrument = models.CharField(max_length=100

class Album(models.Model)

artist = models.ForeinKey(Musician, on_delet=models.CASCADE)

name = models.CharField(max_length=100)

release_date = models.DataField()

num_stars = models.IntegerField()

همون طور که می بینید تو کد بالا تو مدل با نام های خواننده و آلبوم مشخص شدن که هر کدوم هم یک سری فیلدهای مربوط به خودشون رو دارن.  تو جدول خواننده سه فیلد با نام های first_name ، last_name و instrument وجود دارن که اطلاعات اون خواننده رو نشون میدن.

تو جدول آلبوم هم فیلدهای نام آلبوم، تاریخ انتشار، تعداد ستاره و آرتیست وجود دارند. اینجا یه فرق بین فیلد artist با اون یکی فیلدها وجود داره و اونم اینه که این فیلد به عنوان یک کلید خارجی در نظر گرفته شده که کلاس آلبوم رو به کلاس خواننده متصل میکنه و رابطه یک به چند بین اون ها رو نشون میده. در اینجا منظور از رابطه یک به چند اینه که هر خواننده ما میتونه چند آلبوم داشته باشه و ولی هر آلبوم فقط می تونه مربوط به یک خواننده باشه. توجه کنید که فیلد مربوط به کلید خارجی ما در مدل طرف چند (که تو این مثال آلبوم هست) نوشته میشه.

شکل زیر یه مثال دیگه از کلید خارجی رو نشون میده :

مدل ها در جنگو

تو این عکس دو جدول با نام های userprofile و course وجود دارن و همچنین مدل مربوط به جدول course هم نشون داده شده. تو این مدل یک فیلد به عنوان کلید خارجی مشخص شده که جدول course رو به جدول userprofile متصل میکنه و نشون میده که رابطه بین این دو جدول یک به چنده هستش. به بیان دیگه یعنی هر شئ از جدول course حتما به یک شئ تو جدول userprofile متصل شده و با اون در ارتباطه.

نوع فیلد ها

زمانی که ما در داخل مدل فیلدهای اون رو تعریف می کنیم، باید حتما نوع اون فیلدها رو مشخص کنیم. نوع فیلدهای ما طبق داده ای که قراره تو اون فیلد ذخیره بشه مشخض میشن. برای مثال زمانی که قراره تو فیلد ما عدد صحیح ذخیره بشه اون رو از نوع int انتخاب می کنیم و اگر قرار باشه رشته ذخیره بشه اون رو از نوع char تعریف می کنیم.

 

name = models.CharField(max_length = 10)
num = models.IntegerField()

تو کد بالا متغیر name ما از نوع فیلد char تعریق شده و حداکثر طول اون میتونه ۱۰باشه. متغیر num از نوع فیلد int تعریف شده و میتونه اعداد صحیح رو داخلش ذخیره کنه. علاوه بر این دو نوع فیلد، نوع فیلدهای زیر هم جزو فیلدهای پر استفاده در جنگو هستند :

  • BinaryField : برای ذخیره مقادیر باینری و دودویی
  • BooleanField : برای ذخیره True یا False
  • DateField : برای ذخیره تاریخ
  • DateTimeField : برای ذخیره تاریخ و زمان
  • EmailField : برای ذخیره ایمیل
  • FileField : برای ذخیره فایل
  • FloatField : برای ذخیره اعداد اعشاری
  • ImageField : برای ذخیره عکس
  • TextField : برای ذخیره یک جمله

آرگومان های فیلد ( Field options )

هر کدوم از فیلدهای مدل یک سری آرگومان هایی داره که مختص به اون فیلد هستند. برای مثال charfield یک آرگومان با نام max_length داره که حداکثر طول رشته ای که قراره در اون فیلد ذخیره بشه رو مشخص میکنه. اینجا یه سری از رایج ترین آرگومان های مربوط به فیلدهارو آوردیم :

Null : اگر True باشه به این معنیه که فیلد مربوطه در دیتابیس می تونه هیچ مقداری نداشته باشه. مقدار پیش فرض اون false هست.

Blank : اگر True باشه به این معنیه که این فیلد می تونه خالی بمونه.  مقدار پیش فرض این ویژگی هم Null هست.

Default : یک مقدار پیش فرض برای اون فیلد تعریف میکنه و زمانی که به اون فیلدمقدار داده نشه، مقدار پیش فرض رو به خودش میگیره.

Uniqe : اگر True باشه یعنی مقدار این فیلد باید یکتا باشه و هیچ دو شئ نباید مقدار یکسان این فیلد رو داشته باشند.

Primary_key : اگر True باشه این فیلد به عنوان کلید اصلی جدول در نظر گرفته میشه. مقدار این فیلد باید یکتا باشه و اگر یک بار اضافه بشه دیگه قابل تغییر نخواهد بود.

Choices :  فیلد مورد نظر رو به صورت یک باکس انتخابی در میاره. برای مثال :

 

from django.db import models

class Person(models.Model):

SHIRT_SIZES = (
('S', 'Small'),
('M', 'Medium'),
('L', 'Large'),
)
name = models.CharField(max_length=60)
shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)

یک متغیر از نوع تاپل برای لیست مورد نظرمون تعریف می کنیم و اون متغیر رو به آرگومان choices معرفی می کنیم.

مقدار اول در هر تاپل (تو این مثال مقادیر S ،  M  ، L) مقداریه که ما از اون استفاده می کنیم

و مقدار دوم ( تو این مثال مقادیر small , medium , large) مقداریه که در جدول نشون داده میشه.

Help_text : یه سری توضیحات برای فیلد مورد نظر اضافه میکنه.

Verbose_name : همه نوع فیلدها به جز فیلدهای مربوط به نوع ارتباط این ارگومان رو می گیرند که یک نام واضح تر برای اون فیلد تعریف میکنه.

اگر برای این آرگومان مقداری تعریف نشه، به صورت پیش فرض نام اون فیلد به این آرگومان داده میشه.

 

first_name = models.CharField("person's first name", max_length=30)

انواع رابطه های در دیتابیس

جداول دیتابیس ای توانایی رو دارند که با هم ارتباط داشته باشند. به طور کلی در دیتابیس ۳ نوع رابطه بین جداول وجود داره:

  • رابطه یک به یک
  • رابطه یک به چند
  • رابطه چند به چند

در ادامه هر کدوم از این نوع ارتباط ها رو با یک مثال توضیح میدیم.

رابطه یک به یک

برای مثال فک کنید ما قصد طراحی یک دیتابیس برای رستوران های شهر طراحی کنیم که در ابتدا دو جدول ” رستوران ”  و ” مکان ” رو داره که به شکل زیر نوشته شدند :

همون طور که می بینید رابطه بین این دو با یک OneToOneField در داخل جدول رستوران تعریف شده

که نشان دهنده اینه رابطه بین این دو جدول به صورت یک به یک هستش.

حالا رابطه یک به یک یعنی چی ؟ یعنی هر رستوران فقط  یک مکان داره

و هر مکان (شامل یک آدرس و شماره تلفن) میتونه فقط متعلق به یک رستوران باشه.

ما هیچ رستورانی نداریم که دو تا مکان داشته باشه و هیچ مکانی نیست که متعلق به دو رستوران باشه.

اولین آرگومان OneToOneField نام مدلیه که قراره با اون در ارتباطه باشه.

رابطه یک به چند

حالا علاوه بر دو مدل بالا یک مدل هم برای گارسون ها تعریف می کنیم

که به صورت یک به چند با مدل رستوران رابطه خواهد داشت.

در اینجا رابطه یک به چند به این معنیه که هر رستوران ما میتونه چند گارسون داشته باشه

ولی هر گارسون فقط متعلق به یک رستوران هست.

رابطه یک به چند با استفاده از یک کلید خارجی (Foreign key) مشخص میشه که در طرف “چند” نوشته میشه.

تو این مثال طرف چند مدل گارسون هست پس مدل گارسون رو به شکل زیر تعریف می کنیم :

مدل ها در جنگو

همون طور که تو کد بالا مشخصه اولین آرگومان فیلد کلید خارجی نام کلاسیه که این جدول با اون در ارتباطه.

آرگومان بعد یعنی models.CASCADE = on_delete این موضوع رو بیان میکنه که اگر یک شئ مربوط به رستوران حذف شد، شئ های گارسونی که به اون متصل شده بودند رو حذف کن.

رابطه چند به چند

سومین نوع ارتباط موجود در دیتابیس، ارتباط چند به چنده. دو مدل زیر رو در نظر بگیرید :

اینجا دو مدل با نام های پیتزا و ماده غذایی ( مخلفاتی که داخل پیتزا استفاده شده) داریم.

رابطه بین این دو از نوع چند به چنده یعنی هر پیتزا از چند نوع ماده غذایی تشکیل شده

و هر ماده غذایی ممکنه تو چند نوع پیتزای مختلف استفاده شده باشه.

در اینجا هم آرگومان اول این فیلد نام مدلیه که با اون در ارتباط هستش.

در رابطه چند به چند فرقی نداره فیلد نوع ارتباط به چند به چند رو در کدوم مدل تعریف کنیم

ولی بهتره در طرفی تعریف کنیم که از نظر معنایی درست تر باشه.

برای مثال در اینجا هر پیتزا از چند ماده غذایی ایجاد میشه از نظر معنایی درست تره پس فیلد رو در کلاس پیتزا تعریف کردیم.

ذخیره مدل ها در دیتابیس

در نهایت پس از اینکه مدل هاتون نوشته شدن، میتونید با استفاده از دستور

Python manage.py makemigrations

در cmd یا ترمینال تغییرات رو روی دیتابیس اعمال کنید و بعد با دستور

Python manage.py migrate

تغییرات رو روی دیتابیس ذخیره کنید.

برای مطالعه مقالات بیشتر در زمینه پایتون کلیک کنید.

منبع خارجی در زمینه پایتون

6 ديدگاه

  1. 1399-02-15

    میشه چگونگی کار با imagedieldرو توضیح بدین خیلی نیاز دارم

  2. 1399-03-02

    واقعا عالی بود همه سایتارو گشتم هیچکدوم انقد مفصل توضیح نداده

  3. 1399-03-02

    واقعا عالی بود همه سایتارو گشتم هیچکدوم انقد مفصل توضیح نداده

  4. 1399-10-07

    عالی بود توضیحات
    ممنونم

    پایدار باشید.

نوشتن دیدگاه

نشانی ایمیل شما منتشر نخواهد شد.