آموزش جنگو (Basic) : جلسه هفده | بررسی تخصصی فیلد ها

در این جلسه به بررسی تخصصی تر فیلد ها در جنگو خواهیم پرداخت . با ما همراه باشید . آموزش جنگو : جلسه هفده | بررسی تخصصی فیلد هامدل ها : فیلد ها (Field)مهمترین قسمت و تنها قسمت سازنده مدل شما فیلد ها هستند . فیلد ها به صورت attribute یا ویژگی در کلاس شما تعریف می شوند . هرکدام مقدار متفاوتی را اعم از مقادیر نوع int , str , date و غیره و غیره درون خود جای می دهند . به یاد داشته باشید برای تعریف اسم فیلد از اسم هایی مانند clean و delete و save استفاده نکنید ,زیرا این اسم ها باعث تداخل در سیستم API جنگو می شوند .به مثال زیر نگاه کنید . در این مثال دو مدل را ساخته ایم و درون آن ها فیلد هایی را ایجاد کردیم . شما از طریق models به انواع فیلد های دیتابیس دسترسی خواهید داشت .from django.db import models class Musician(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) instrument = models.CharField(max_length=100) class Album(models.Model): artist = models.ForeignKey(Musician, on_delete=models.CASCADE) name = models.CharField(max_length=100) release_date = models.DateField() num_stars = models.IntegerField()جنگو برای تعیین نوع هر فیلد ,همانطور که گفتیم از کلاس models استفاده میکند . جنگو تعیین نوع هر فیلد را بخاطر دلایلی انجام می دهد :1-تعیین نوع داده ای ستون در دیتابیس (هر کدام از فیلد های یک ستون هستند و ستون ها انواعی مانند INTEGER , TEXT و غیره دارند )2-برای تعیین نوع ورودی در فرم های ایجاد شده به صورت اتوماتیک (بعضی وقت ها شما ساخت فرم در HTML را به جنگو میتوانید بسپارید و در آنجا از نوع فیلد ها جنگو نوع هر input را مشخص میکند . برای مثال ”type=“email , text , number)جنگو انواع مختلفی از فیلد ها را به شما ارائه میکند که بعدا درباره تمامی آنها صحبت خواهیم کرد . همچنین شما میتوانید نوع داده به خصوصی را برای جنگو ایجاد کنید که درباره این هم بعدا صحبت خواهیم کرد .مدل ها : Field optionsهر فیلد چند ارگومان را از شما می تواند دریافت کند تا ویژگی هایی را درون خود بسازد . بعضی از این آرگومان ها برای بعضی از فیلد های خاص اجباری هستند . برای مثال در charfield شما باید حداکثر تعداد کاراکتری که فیلد یا ستون دیتابیس شما میتواند قبول کند را با max_length به عنوان آرگومان به آن ارسال کنید .همچنین شما چندین آرگومان در اختیار دارید که برای همه فیلد ها موجود هستند و اکثر آنها اختیاری هستند . ما به بررسی پرمصرف ترین آنها خواهیم پرداخت . در قسمت های جلوتر به بررسی بقیه آنها نیز خواهیم پرداخت .آرگومان Null :اگر برابر با True قرار داده شود ,مقدار های خالی فیلد ها را برابر با مقدار NULL در نظر خواهد گرفت . پیش فرض آن False است . (این به این معناست که اگر این مقدار را برابر True قرار دهید فیلد شما اگر خالی بماند مقدار null را برای شما در دیتابیس در نظر میگیرد .)آرگومان Blank :اگر True باشد ,فیلد شما می تواند خالی بماند . یعنی هیچ مقداری را دریافت نکند ولی شی شما ذخیره یا سیو شود . پیش فرض آن False است .نکته : null و blank با یکدیگر تفاوت دارند . Null یک مقدار است که در فیلد خالی شما می تواند قرار بگیرد ولی blank به معنای پذیرفتن مقدار کاملا خالی برای آن فیلد است . (در صورتی که به اطلاعات بیشتری نیاز دارید ,در گوگل جستجو کنید )آرگومان Choices :یک لیست حاوی تاپل هایی که انتخاب های شما برای آن فیلد هستند . اگر این مقدار برای فیلد شما تعریف شود ,جنگو در ادمین پنل بجای یک ورودی عادی به شما یک سلکت باکس یا select box نمایش خواهد داد که گزینه هایی که در آن وجود دارند , در واقع همان تاپل هایی هستند که شما تعریف کرده اید .یک لیست choice به شکل زیر است :YEAR_IN_SCHOOL_CHOICES =[ ('FR', 'Freshman'), ('SO', 'Sophomore'), ('JR', 'Junior'), ('SR' , 'Senior'), ('GR', 'Graduate'), ]نکته :هر بار که یک تاپل choice را تعریف می کنید یا تغییر می دهید باید migrate را اجرا کنید .مقدار اول هر تاپل مقداری است که در دیتابیس ذخیره می شود . مقدار دوم تاپل ها نامی است که در ادمین پنل بجای مقدار دیتابیسی هر تاپل نمایش داده می شود تا شما بتوانید آنها را بخوانید .شما همچنین می توانید به مقدار هر فیلد که دارای تاپل choice است ,با متود ()get_FOO_display دسترسی پیدا کنید که FOO اینجا همان نام فیلد شما است . به مثال زیر نگاه کنید که چگونه همچین اتفاقی میافتد :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)حال آن را میتوانیم در ترمینال تست کنیم :>>> p = Person(name=&quotFred Flintstone&quot, shirt_size=&quotL&quot) >>> p.save() >>> p.shirt_size 'L' >>> p.get_shirt_size_display() 'Large'شما همچنین می توانید از روش زیر نیز برای ایجاد گزینه ها استفاده کنید . در این روش یک فیلد جدا ایجاد میکنید و تمامی گزینه ها را درون آن وارد می کنید :from django.db import models class Runner(models.Model): MedalType = models.TextChoices('MedalType' ,'GOLD SILVER BRONZE') name = models.CharField(max_length=60) medal = models.CharField(blank=True, choices=MedalType.choices, max_length=10)البته نگران نباشید این روش ها را در جلوتر دوباره بررسی خواهیم کرد تا در ذهن شما جا بیافتد . این فقط یک آشنایی اولیه است .آرگومان Defualt :این مقدار پیش فرضی است که برای فیلد شما در نظر گرفته می شود . برای مثال یک BoleanField می تواند به صورت پیش فرض False تعیین شود . این مقدار هر بار شی جدیدی ایجاد شود و مقداری از طرف ادمین به فیلد اختصاص داده نشود , فراخوانی خواهد شد .آرگومان Help_text :مقداری که برای این ارگومان تعریف شود ,در زیر فیلد به صورت یک متن کوچک نمایش داده خواهد شد و صرفا یک متن برای این است تا بفهمید کار آن فیلد چیست ؟ به تصویر زیر نگاه کنید : (نوشته کوچک در پایین فیلد summery)آرگومان help_text در فیلدهاآرگومان Primary_key :اگر True باشد ,فیلد شما تبدیل به primary_key مدل شما خواهد شد . در حالت عادی این مقدار به صورت اتوماتیک ایجاد می شود و جنگو بدون نیاز به حرکت خاصی برای هر مدل یک فیلد id ایجاد خواهد کرد . (primary_key یعنی فیلدی که مقدار آن اختصاصی باشد و مختص همان رکورد باشد , و از آن برای شناسایی و جداسازی رکورد های مشابه استفاده میکنیم )نکته :فیلد های primary_key به صورت read_only ساخته می شوند . پس اگر شما تلاش کنید مقدار primary_key را در یک شی تغییر دهید ,یک شی جدید ایجاد می شود . به مثال زیر دقت کنید که فیلد name را به عنوان primary_key تعیین کرده ایم و وقتی تلاش میکنیم تا name یکی از رکورد های این مدل را تغییر دهیم و آن را سیو کنیم, جنگو برای ما شی جدیدی را با آن name ایجاد خواهد کرد .from django.db import models class Fruit(models.Model): name = models.CharField(max_length=100, primary_key=True)و ایجاد شی به شکل زیر خواهد بود :>>> fruit = Fruit.objects.create(name='Apple') >>> fruit.name = 'Pear‘ >>> fruit.save() >>> Fruit.objects.values_list('name', flat=True) <QuerySet['Apple', 'Pear']>آرگومان unique :اگر Trueباشد ,مقدار فیلد شما اختصاصی خواهد بود و هیچ رکورد دیگری در جدول نمی تواند آن مقدار را بگیرد . برای مثال فیلدی حاوی شماره شناسایی شما باید این ویژگی را داشته باشد تا شخص دیگری نتواند از شماره شناسایی شما استفاده کند .توجه کنید که این مثال ها بعد ها دوباره در این فصل مرور خواهند شد .مدل ها : verbose nameاین مورد در تمامی فیلد ها کاربرد دارد و برای نام گذاری فیلد به کار می رود . جنگو نام هر فیلد که در ادمین پنل نمایش داده می شود را از روی نام متغییری که فیلد را درون آن ایجاد کردید ,میسازد . اما ممکن است شما بخواهید این رفتار را تغییر دهید یا نامی که در ادمین پنل نشان داده می شود را برای یک فیلد تغییر دهید و آن را فارسی کنید.برای این کار فقط کافیست verbose_name را در فیلد تعریف کنید :first_name = models.CharField(verbose_name=&quotperson's first name&quot, max_length=30)حال در ادمین پنل نام فیلد شما به “person’s first name” تغییر پیدا کرده است . (نام فیلد شما در دیتابیس نیز تغییر میکند)ولی اگر verbose_name را برای فیلد تعریف نکنید (مثال زیر) ,نام فیلد شما از روی نام متغییر شما برداشته می شود . برای مثال در زیر نام فیلد شما “first_name” است .first_name = models.CharField(max_length=30)همچنین در تمامی فیلد ها به جز فیلد هایی که درون آنها رابطه وجود دارد , شما میتوانید بدون استفاده از کلمه کلیدی verbose_name و فقط نوشتن آن به عنوان آرگومان اول ,این کار را انجام دهید . به دو مثال زیر نگاه کنید که در یکی از آنها مجبوریم از کلمه کلیدی استفاده کنیم و در دیگری از روش اول استفاده کرده ایم :first_name = models.CharField(&quotperson's first name&quot, max_length=30)مثال دوم :poll = models.ForeignKey( Poll, on_delete=models.CASCADE, verbose_name=&quotthe related poll&quot, ) sites = models.ManyToManyField( Site, verbose_name=&quotlist of sites“ ) place = models.OneToOneField( Place, on_delete=models.CASCADE, verbose_name=&quotrelated place&quot, )نکته : برای verbose_name لازم نیست حرف اول را بزرگ بنویسید . جنگو به طور اتوماتیک در صورت نیاز این کار را انجام خواهد داد .در این جلسه نیز به بررسی تخصصی فیلد ها و تنظیمات آنها پرداختیم . در جلسه بعدی به بررسی روابط دیتابیسی به صورت تخصصی خواهیم پرداخت .