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

در این جلسه به بررسی تمامی فیلد های موجود در جنگو خواهیم پرداخت . با ما همراه باشید .آموزش جنگو : جلسه بیست و سه | انواع فیلدهافیلد ها : انواع فیلدبیایید با هم انواع فیلد ها را به طور کامل بررسی کنیم .فیلد AutoField / class AutoField(**options) :یک IntegerField است که به صورت خودکار بر اساس id ها در هر رکورد افزایش میابد . شما معمولا نیازی به استفاده مستقیم از آن ندارید , مگر اینکه فیلد id را ایجاد نکنید . (گرچه فیلد id به صورت خودکار برای شما اضافه خواهد شد!)فیلد BigAutoField / class BigAutoField(**options) :یک Autofield که اعداد 64 بیتی که از اعداد از 1 تا 9223372036854775807 را تشکیل می دهند را پشتیبانی می کند .فیلد BigIntegerField / class BigIntegerField(**options) :یک integerField که اعداد را درون خود ذخیره می تواند کند و محدوده اعداد 9223372036854775808- تا 9223372036854775808 را می تواند بپذیرد . اگر یک ModelForm را از این فیلد ایجاد کنید ,فیلد به صورت یک ویجت (همان فرم های html که انواع مختلف دارند و این یکی number است) انتخاب عدد نمایش داده خواهد شد.فیلد BinaryField / class BinaryField(max_length=None, **options) :یک فیلد برای ذخیره داده های باینری خام است . می توان بایت ,آرایه بایت یا memoryview را به در آن ذخیره کرد. به طور پیش فرض مقدار editable در آن روی False گذاشته شده است . در این صورت در یک ModelForm نمایش داده نمی شود و قابل ویرایش نخواهد بود . همچنین مقدار max_lentgh را می تواند به صورت اختیاری دریافت کند که maximum length تعداد بایت های شما است . این توسط خود جنگو هنگام وارد کردن اطلاعات بررسی می شود .فیلد BooleanField / class BooleanField(**options) :یک فیلد که مقدار True یا False را قبول می کند .ویجت آن (نمایش آن در فرم ها) به صورت یک checkbox خواهد بود که اگر تیک آن زده شده باشد مقدار True برای آن فیلد در نظر گرفته می شود . وقتی مقدار default برای آن تعریف نشود نیز در صورت خالی بودن تیک مقدار None برای آن در نظر گرفته می شود . (باید حتما default=False یا default=True برای آن تعریف شود, وابسته به شرایط)فیلد CharField / class CharField(max_length=None, **options) :یک فیلد برای ذخیره سازی رشته های دارای محدودیت کاراکتر . (اگر نمی خواهید محدودیت داشته باشید ,از TextField استفاده کنید)ویجت مربوط به این فیلد یک TextInput است .نکته : ویجت ها یا در ModelForm به صورت اتوماتیک ساخته می شوند و یا باید فرم را خودتان در html بسازید و name های Input را خودتان به صورت دستی برای هر فیلد برابر با مقدار متغییر حاوی آن قرار دهید . این مهم است که از همان ویجت و از همان نوع input برای هر فیلد استفاده کنید .مقدار هایی به عنوان ارگومان توسط این فیلد دریافت خواهند شد :مقدار max_length که به صورت اجباری دریافت می شود ,تعداد محدودیت کاراکتر برای رشته ورودی است . (یک عدد باید وارد شود برای مثال 500)همچنین مقدار db_collaction نیز می تواند به صورت اختیاری دریافت شود که همان database collaction name برای آن فیلد است . (مباحث sql)فیلد DateField / class DateField(auto_now=False, auto_now_add=False, **options) :یک فیلد برای ذخیره تاریخ ,که نمونه ای از کلاس datetime.date را نشان می دهد . ارگومان های زیر را به صورت اختیاری می تواند دریافت کند .مقدار auto_now هر بار که شی ای سیو شود ,تاریخ را به صورت خودکار روی همان تاریخ روز ذخیره خواهد کرد (زمان حال) . این برای کارهایی مانند اخرین ویرایش یا اخرین تغییر مناسب است و می تواند مورد استفاده قرار بگیرد .توجه داشته باشید هنگامی که مدل شما سیو می شود این ارگومان مقدار زمان حال را برای شما اعمال میکند و در صورتی که فیلدی از شی را اپدیت کنید , این تغییر اعمال نمی شود (تغییر فیلد DateTime) . اگر چه می توانید برای بروزرسانی آن در هنگام اپدیت شی ,مقدار فیلد DateField را نیز تعیین کنید .مقدار بعدی Auto_now_add می باشد . این به شما اجازه می دهد تا به صورت خودکار وقتی اولین بار شی ای را ایجاد می کنید ,زمان فیلد روی حال تنظیم شد (حال منظور زمان ایجاد شی است). توجه داشته باشید که برای ارگومان قبلی میتوان مقداری رو خود تعیین کرد ولی برای این مورد امکان این کار وجود ندارد و حتی اگر مقداری را خود تعیین کنید نادیده گرفته خواهد شد . اگر می خواهید کاری کنید تا بعدا بتوانید این فیلد را تغییر دهید , بجای auto_now_add موارد زیر را تنظیم کنید .برای DateField :مقدار default=date.today را تنظیم کنید . (datetime.date.today)برای DateTimeField :مقدار default=timezone.now را تنظیم کنید . (django.utils.timezone.now)ویجت این فیلد یک DateInput است . در ادمین پنل به صورت یک تقویم جاوا اسکریپت نشان داده می شود و یک میانبر today در کنار آن برای تنظیم زمان الان وجود دارد . همچنین یک key برای سفارشی سازی خطا دارد (invalid_date) . در مورد سفارشی سازی خطاها میتوانید تحقیق کنید .به یاد داشته باشید شما نمی توانید همزمان Auto_add و auto_now_add را در کنار هم داشته باشید . (منجر به خطا خواهد شد!)نکته :زمان حال جنگو از روی timezone در فایل settings.py مشخص می شود . (برای هر کشور فرق باید داشته باشد)فیلد DateTimeField / class DateTimeField(auto_now=False, auto_now_add=False, **options) :این فیلد مقدار تاریخ و زمان (ساعت) را در خود ذخیره میکند که نمونه از کلاس datetime.datetime است . این فیلد مقدار ارگومان های یکسانی با فیلد DateField می گیرد .ویجت این فیلد , DateTimeInput است . در ادمین پنل دو Textnput قرار داده خواهد شد که یکی برای تاریخ و دیگری برای زمان است . همچنین دو میانبر جاوااسکریپت برای تنظیم زمان و تاریخ حال را دارد .فیلد DecimalField / class DecimalField(max_digits=None, decimal_places=None, **options) :یک فیلد که نوع اعداد اعشاری را دریافت و درون خود ذخیره میکند . این مقدار با DeciamlValidator اعتبارسنجی می شود . ارگومان های زیر را به صورت اجباری دریافت میکند (باید داده شود) .مقدار max_digits که یک عدد را دریافت میکند . این عدد حداکثر تعداد اعدادی است که میتوانید در فیلد وارد کنید. این عدد باید مساوی یا بزرگتر از تعداد رقم های عدد اعشاری شما باشد .مقدار decimal_places در جایگاه دوم ارگومان ها دریافت می شود . این همان تعداد رقم های اعشار شماست (مورد بالا در مورد تعداد رقم ها و این مورد درباره تعداد اعشارها است) .به عنوان مثال برای ذخیره عدد 999.99 با دو رقم اعشار باید کد زیر را وارد کنید :models.DecimalField(..., max_digits=5, decimal_places=2)و برای ذخیره اعداد اعشاری تا تقریب میلیارد و حداکثر 10 رقم اعشار باید کد زیر را بنویسید . (فیلد باید به شکل زیر باشد )models.DecimalField(..., max_digits=19, decimal_places=10)ویجت مربوط به این فیلد یک NumberInput است .فیلد EmailField / class EmailField(max_length=254, **options) :این فیلد برای ذخیره سازی ایمیل به کار می رود و مزیت آن این است که مقدار ورودی را با EmailValidator بررسی می کند تا ایمیل ورودی درست باشد .فیلد FieldField / class FileField(upload_to='', storage=None, max_length=100, **options) :یک فیلد برای اپلود فایل . (هر نوع فایل)نکته :گزینه primary_key برای این فیلد کار نمی کند !مقدار ارگومان های زیر را می پذیرد :مقدار upload_to برابر با دایرکتوری و فولدری قرار داده می شود که فایل شما در آن ذخیره خواهد شد . اینکار به دو روش انجام می شود و در هر دو روش مقدار آرگومان به متد ()Storge.save ارسال می شود .اگر شما از یک مسیر یا str استفاده کنید ,آن را برای شما در همان فولدر سیو می کند اما در بعضی مواقع می توانید از قالب بندی ()strftime استفاده کنید که مکان ذخیره فایل در فولدری با نام مساوی با تاریخ ذخیره فایل سیو خواهد شد . برای مثال کد زیر را به همراه کامنت های آن بررسی کنید :class MyModel(models.Model): # file will be uploaded to MEDIA_ROOT/uploads upload = models.FileField(upload_to='uploads/') # or... # file will be saved to MEDIA_ROOT/uploads/2015/01/30 upload = models.FileField(upload_to='uploads/%Y/%m/%d/')میبینید که در مثال دوم فایل شما در فولدری با نام تاریخ همان روز ذخیره خواهد شد .در روش دوم ممکن است شما از FileSystemStorge پیش فرض استفاده کنید . در این مواقع مقدار strو رشته شما به مسیر MEDIA_ROOT شما اضافه می شود تا فایل ها در فضای محلی سیستم شما در پوشه media ذخیره شوند .اگر از فضای ذخیره سازی دیگری می خواهید استفاده کنید بهتر است تا درباره storge در جنگو تحقیق کنید .(بعد ها به آنها خواهیم پرداخت )همچنین در برخی از مواقع برای ایجاد مسیر های ذخیره سازی پویا , کافی است تا بجای یک رشته , یک تابع را در ارگومان قرار دهید . این تابع باید حتما دو مقدار instance و filename را بپذیرد و سپس مسیر را به صورت یک رشته بازگرداند .نکته :مقدار instance در واقع همان شی ای از مدلی است که حاوی فیلد FileField است و هم اکنون درون آن شی فایل شما ذخیره شده است . در بیشتر مواقع این شی هنوز در دیتابیس ذخیره نشده است ,پس اگر از AutoField های پیش فرض استفاده میکنید شاید هنوز مقداری برای شی نداشته باشند . (انها بعد از ذخیره شدن مقداری را اختصاص می دهند و شما تا قبل از آن به مقدار هایش دسترسی ندارید ) این مورد فقط برای AutoField درست است .نکته :مقدار filename نیز همان نام فایلی است که به تازگی آپلود شده است (نام خود فایل).به مثال زیر نگاه کنید :def user_directory_path(instance, filename): # file will be uploaded to MEDIA_ROOT/user_<id>/<filename> return 'user_{0}/{1}'.format(instance.user.id, filename) class MyModel(models.Model): upload = models.FileField(upload_to=user_directory_path)استفاده از یک FileField یا ImageField در جنگو که نیازمند اپلود یک فایل است , نیازمند انجام چند مرحله است.1-در فایل settings.py باید مسیر MEDIA_ROOT را که همان مسیر ذخیره فایل های شماست را تعریف کنید . برای کارایی بیشتر جنگو آنها را در داخل دیتابیس ذخیره نمی شود . MEDIA_URL نیز به عنوان url عمومی پایه آن دایرکتوری تعیین کنید . (برای MEDIA_ROOT مقدار 'BASE_DIR /‘media/ و برای MEDIA_URL مقدار ‘/media/’ به طور معمول تعیین می شود)2-فیلد FileField یا ImageField را اضافه کنید و مقدار ارگومان upload_to را نیز که فولدر زیرشاخه ای را در مسیر MEDIA_ROOT شما ایجاد میکند ,تعیین کنید .3-در دیتابیس شما ,آدرس ذخیره سازی فایل وابسته به MEDIA_ROOT ذخیره خواهد شد . شما در تمپلیت می توانید با ارجاع به فیلد آن شی و قرار دادن url بعد از آن به استفاده از آن بپردازید . برای مثال اگر فیلد شما در شی mug_shot نام داشته باشد ,آدرس ذخیره شدن آن در جنگو به صورت زیر خواهد بود و از آن می توانید برای src عکس ها در HTML استفاده کنید .{{ object.mug_shot.url }}برای مثال اگر MEDIA_ROOT روی ‘home/media/’ تنظیم باشد و upload_to دارای مقدار ‘photos/%y/%m/%d’ باشد , مسیر فایل اپلود شده در مدل شما در روز 15ژوئن 2007 برابر خواهد بود با : /home/media/photos/2007/01/15به یاد داشته باشید که مقدار y% به معنای سال لحظه اپلود و m% ماه لحظه اپلود و بعدی روز اپلود خواهد بود و از روی سیستم شما شناسایی می شود . علاوه بر این upload_to فقط مسیر فایل های اپلود شده برای همان مدل را تعیین می کند و upload_to در یک مدل دیگر می تواند در فولدر های دیگری ذخیره شود .جنگو برای هر کدام از فایل ها یک attribute نیز با نام url اختصاص می دهد که محل ذخیره فایل شماست . این همان url است که در تمپلیت برای ارجاع دادن به محل ذخیره فایل یا عکس استفاده میکنیم .نکته امنیتی : به یاد داشته باشید که هر گاه با فایل ها در جنگو می خواهید سر و کله بزنید , باید حواستان را جمع کنید که فایل ها را در کجا و چه نوع فایلی را دارید ذخیره می کنید . اگر فایل ها از طرف کاربر اپلود می شوند ,باید قبل از ذخیره سازی آنها ,بررسی امنیتی را برای ایمن بودن فایل انجام دهید یا نوع فایل ورودی را کنترل کنید . اگر به این نکته توجه نشود ,کاربر می تواند یک فایل CGI یا PHP را در وبسایت اپلود کند و با رفتن به آدرس آن ,آن را اجرا کند . اجازه این کار را به کاربر ندهید .توجه کنید حتی فایل های HTML نیز که در سمت کاربر و در مرورگر آنها اجرا می شوند می توانند باعث ایجاد خطرات امنیتی و حملات XSS و یا CSRF شود .نکته : شی های دارای FileField در دیتابیس شما فیلد هایی از نوع varchar و max_length=100 هستند . مانند باقی فیلد ها میتوانید با تعیین max_length در آنها ,آنها را افزایش دهید .فیلد ها : تفاوت میان FileField و FieldFileهرگاه که به یک FileField دسترسی پیدا میکنید ,جنگو به شما یک شی FieldFile را می دهد .این در واقع همان FileField است ولی جنگو برای شما آن را ساده سازی کرده است و دیگر یک شی پیچیده بسته بندی شده در اطراف فایل داخلی پایتون نیست . در عوض یک ()Storge.open است که ساده شده و متد های کاربردی در آن برای شما قرار داده شده است . برای مثال استفاده از ویژگی url برای دسترسی به محل ذخیره فایل یکی از ویژگی های آن است . بقیه ویژگی ها نیز همانگونه و با رجوع به شی و سپس فیلد و سپس متد FieldFile موردنظر قابل دسترسی هستند . برای مثال object.FileField_name.url (در ویو و تمپلیت ها)علاوه بر این ,آنها میتوانند بر روی فایل اصلی تغییراتی ایجاد کنند . (متد های اصلی پایتون برای فایل ها شامل read, write, …)ویژگی name :این همان نام فایل ذخیره شده است .ویژگی Path :این به شما مسیر ذخیره فایل را در فضای محلی سیستم فقط به صورت read_only به شما بازمیگرداند . (متد ()path را بر روی فایل فراخوانی میکند )ویژگی Size :مقدار سایز فایل را به بایت به شما بازمیگرداند .ویژگی url :این به شما مسیر ذخیره فایل را در فضای وبسایت فقط به صورت read_only به شما بازمیگرداند . (متد ()url را بر روی فایل فراخوانی میکند )متد Open(mode=‘rb’) :فایل را برای شما باز می کند . اگر باز باشد ,آن را میبندد و دوباره باز خواهد کرد . به یاد داشته باشید مانند پایتون معمولی این متد یک file descriptor را به شما باز نمیگرداند .متد Delete(save=True) :این متد از شی ,باعث می شود تا فایل مربوط به آن شی حذف شود . به یاد داشته باشید که فراخوانی ()delete فایل باز را خواهد بست .همچنین داخل این متد می توانید با save=True تعیین کنید که شی حاوی این فایل پس از حذف ذخیره شود یا خیر . (متد save روی آن فراخوانی شود یا خیر)به یاد داشته باشید اگر شما مدل را حذف کنید ,فایل های مربوط به آن قرار نیست حذف بشوند و باقی خواهند ماند . برای حذف آنها باید به صورت دستی اقدام کنید یا آن را با تایم بندی زمانی مشخص و دستورات ترمینال حذف کنید .فیلد ها : ادامه انواع فیلد هافیلد FilePathField / class FilePathField(path='', match=None, recursive=False, allow_files=True, allow_folders=False, max_length=100, **options) :یک CharField است که انتخاب ها و گزینه های آن محدود به نام فایل ها و پوشه ها در یک دایرکتوری از سیستم است .چندین ارگومان خاص دارد که اولی path اجباری است .آرگومان path یک مسیر دقیق را قبول میکند که حاوی پوشه ای است که نام فایل ها و زیرپوشه های آن به عنوان انتخاب و گزینه های این فیلد برگزیده می شوند . برای مثال “/home/images”ممکن است همچنین path یک تابع را نیز قبول کند که به صورت یک رشته مسیر جاری را باز میگرداند . (برای پویا سازی مسیر در زمان اجرا ) . برای مثال :import os from django.conf import settings from django.db import models def images_path(): return os.path.join(settings.LOCAL_FILE_DIR, 'images') class MyModel(models.Model): file = models.FilePathField(path=images_path)آرگومان بعدی match است . این یک ارگومان اختیاری است . این یک رشته را دریافت میکند که یک regular expression یا همان عبارت منظم است . فیلد شما از این عبارت منظم استفاده خواهد کرد تا فقط فایل های داخل پوشه ها را (نه پوشه ها ,فقط فایل ها) بر اساس آن فیلتر کند . برای مثال :الگوی “foo.*\.txt$" با فایلی با نام foo23.txt مطابقت دارد و گزینه این فایل در فیلد مشاهده خواهد شد . اما فایلی با نام bar.txt چون با عبارت شما تطابق ندارد ,در گزینه های قابل انتخاب مشاهده نخواهد شد .آرگومان بعدی recursive است که اختیاری است و به صورت پیش فرض برابر با False قرار داده شده است . می تواند به True تغییر پیدا کند . این گزینه مشخص می کند که آیا همه ی زیرپوشه ها برای شما شامل باید بشوند یا خیر .آرگومان بعدی allow_files است که اختیاری است و پیش فرض برابر با True قرار داده می شود . میتواند به Falseتغییر پیدا کند . این مشخص می کند که آیا فایل های موجود در مسیر مشخص شده باید به عنوان گزینه نشان داده شوند یا خیر . این یا allow_folders باید True باشد . (فقط یکی از آنها)آرگومان بعدی allow_folders است که اختیاری است و پیش فرض برابر با True قرار داده می شود . میتواند به False تغییر پیدا کند . این مشخص می کند که آیا فولدر های موجود در مسیر مشخص شده باید به عنوان گزینه نشان داده شوند یا خیر . این یا allow_files باید True باشد . (فقط یکی از آنها)نکته :آرگومان match برای نام فایل پایه صرفا اعمال خواهند شد و نه مسیر کامل . برای مثال :FilePathField(path=&quot/home/images&quot, match=&quotfoo.*&quot, recursive=True)این خط از کد با مسیر home/images/foo.png مطابقت دارد ولی با home/images/foo/bar.png مطابقت پیدا نخواهد کرد . زیرا این تطابق برای نام فایل ها (و نه فولدر ها) اعمال می شود . (foo.png و bar.png فایل های پایه هستند)آرگومان آخر max_length است که برای این فیلد روی 100 تنظیم شده است . مانند سایر فیلد ها ,میتوانید حداکثر تعداد کاراکتر ها را بازنویسی کنید . (max_length را دوباره بنویسید)فیلد FloatField / class FloatField(**options) :یک فیلد که اعداد ممیزی را مانند 5.9 یا 1.2 یا 3.4 را درون خود ذخیره میکند .ویجت فرم و نوع فرم آن در html یک NumberInput است .نکته :تفاوت میان DecimalField و FloatField این است که اولی از نوع Decimal در پایتون استفاده میکند و دومی از نوع Float در پایتون استفاده میکند . در مورد آنها در گوگل جستجو کنید .فیلد GenericIPAddressField / class GenericIPAddressField(protocol='both', unpack_ipv4=False, **options) :یک فیلد برای ذخیره سازی ip می باشد . آنها را در فرمت str یا رشته ذخیره میکند (برای مثال 192.168.1.1 یا 2a02:42fe::4 ). ویجت این فیلد یک TextInput است . این فیلد چند آرگومان نیز دریافت میکند .آرگومان اول protocol است که باعث می شود ,ورودی های فیلد شما محدود به ip هایی از نوع IPV4 یا IPV6 باشد . به حروف کوچک و بزرگ حساس نیست و دو مقدار IPV4 یا IPV6 است . (مقدار پیش فرض آن روی both یا هردو تنظیم شده)آرگومان unpack_IPV4 آرگومان دوم است که اگر برابر با True باشد آدرس های پک شده مانند ::ffff:192.0.2.1 باز خواهند شد . یعنی برای مثال آن را به صورت 192.0.2.1 ذخیره خواهد شد . برای استفاده از آن گزینه protocol باید روی both تنظیم شده باشد .فیلد ImageField / class ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options) :همان FileField است ولی اعتبارسنجی آن تنها برای عکس ها ممکن است و شما در آن فقط میتوانید عکس آپلود کنید .علاوه بر تمام ویژگی هایی که FileField دارند ,یک ImageField مقدار های height و width را نیز دریافت میکند. (منظور این است این ارگومان ها را نیز علاوه بر ارگومان های یکسان با FileField دریافت میکند)ارگومان اول height_field است که مقدار ارتفاع تصویر را ذخیره خواهد کرد . هر بار که یک عکس را اپلود کنید ارتفاع تصویر به همان سایز تغییر پیدا خواهد کرد .آرگومان دوم نیز width_field است که عرض عکس را کنترل میکند . هر بار که عکسی را اپلود کنید , عرض عکس به همان سایز تغییر پیدا میکند .نکته : کتابخانه pillow باید قبل از استفاده از ImageField نصب بشود .به یاد داشته باشید اگر مسیر منتهی به عکس شما بیش از 100 کاراکتر طول دارد , باید max_length را که به طور پیش فرض روی 100 تنظیم شده ,بازنویسی کنید .ویجت فرم این فیلد یک FileInput است . (type=file)فیلد IntegerField / class IntegerField(**options) :این فیلد مقدار های اعداد بین 2147483648- تا 2147483648 را قبول میکند .این فیلد از اعتبارسنجی برای شناسایی بازه مقدار ورودی استفاده می کند . (MinValueValidator و MaxValueValidator)ویجت فرم آن نیز یک NumberInput است .فیلد JSONField / class JSONField(encoder=None, decoder=None, **options) :این فیلد مقدار های JSON را میتواند درون خود ذخیره کند . (در پایتون نوع Json پشتیبانی نمی شود)در دیتابیس های MariaDB , Mysql 5.7.8+ , Oracle , Postgressql و sqlite این فیلد پشتیبانی می شود.(json extention را فعال می کند)آرگومان های این فیلد عبارتند از :آرگومان encoder که یک آرگومان اختیاری است . این گزینه برای serialize کردن انواع داده های JSON که توسط serializer استاندارد کتابخانه json پشتیبانی نمی شوند ,استفاده می شود (برای اطلاع بیشتر از serializer در گوگل جستجو کنید . این بحث مربوط به Json است و در این کتاب جای نمیگیرد) برای مثال UUID یا datetime.datetime .به عنوان مقدار باید از کلاس ها استفاده کنید . کلاس پیشنهادی ما DjangoJSONEncoder است که به عنوان مقدار آرگومان باید قرار بگیرد .پیش فرض آن روی json.JSONEncoder است .آرگومان بعدی decoder است که یک ارگومان اختیاری است و یک کلاس را دریافت میکند . این برای شما مشخص می کند که deserializer نوع داده ای Json شما باید چه باشد . در واقع جنگو مقدار json را از دیتابیس دریافت میکند و برای بازگرداندن آن از کلاس ورودی این آرگومان استفاده می کند . یعنی فرمت خروجی شما از این کلاس مشخص می شود (برای مثال ممکن است یک رشته باشد). مشکل آن این است که شما نمی توانید از نوع داده ورودی به این فیلد مطمین باشید .کلاس پیش فرض انتخابی برای این آرگومان JSONDecoder است .بعدا در مورد چگونگی جستجو در دیتابیس بر اساس JSONField توضیح خواهیم داد .نکته :اگر فیلد ها را روی پیش فرض قرار دادید ,مطمین شوید که خروجی شما یک رشته یا شی قابل فراخوانی مانند دیکشنری یا تابع باشد . اگر خروجی برای داده ای قابل تغییر مانند لیست باشد ,مقدار یک شی را بین تمام شی های مدل دیگر بازنویسی می کند .نکته :نوع داده ای Json در تمام دیتابیس ها پشتیبانی نمی شود . بنابراین پیشنهاد می شود تا حد ممکن از تبدیل نوع داده ای Json به str و سپس بالعکس استفاده کنید .فیلد PositiveBigIntegerField / class PositiveBigIntegerField(**options) :فیلدی که اعداد بین 0 تا 9223372036854775807 را می تواند در خود ذخیره کند .فیلد PositiveIntegerField / class PositiveIntegerField(**options) :فیلدی که اعداد میان 0 تا 2147483647 را در خود ذخیره میتواند کند .فیلد PositiveSmallIntegerField / class PositiveSmallIntegerField(**options) :فیلدی که اعداد میان 0 تا 32767 را در خود ذخیره میکند .فیلد SlugField / class SlugField(max_length=50, **options) :اسلاگ ها بخش های اساسی url یا آدرس ها هستند . آنها مقادیر کوتاهی از اعداد , حروف و –یا _ هستند . شما قبلا با طرز استفاده از آنها آشنا شده اید .به طور پیش فرض , max_length روی 50 تنظیم شده است . اما با تعیین آن در فیلد میتوانید آن را بیشتر کنید. به یاد داشته باشید با ایجاد فیلد slug , گزینه db_index برای مدل روی True تعیین می شود .نکته :شما میتوانید کاری کنید که فیلد اسلاگ بر اساس فیلدی دیگر در مدل به طور خودکار پر شود . این کار در فایل admin.py با استفاده از prepopulated_fields انجام می شود . بعدا درباره چگونگی انجام این کار صحبت می کنیم.همچنین فیلد اسلاگ از توابع validate_slug یا validate_unicode_slug استفاده میکند .آرگومان بعدی که این فیلد دریافت میکند allow_unicode است . به یاد داشته باشید فیلد های اسلاگ فقط حروف انگلیسی را قبول میکنند . پس اگر با زبانی مانند فارسی میخواهید آنها را ایجاد کنید (بهتر است اینکار را کنید) باید آن را روی True تنظیم کنید . به صورت پیش فرض برابر با False است .فیلد SmallAutoField / class SmallAutoField(**options) :همان AutoField است اما اعداد میان 1 تا 32767 را قبول خواهد کرد .فیلد SmallIntegerField / class SmallIntegerField(**options) :فیلدی که اعداد بین 32768- تا 32767 را می تواند در خود ذخیره کند .فیلد TextField / class TextField(**options) :یک فیلد برای ذخیره متن است ,ویجت آن یک Textarea است و به همین علت در جاهایی مانند فرم ارسال نظرات از آن استفاده میکنند .اگر شما یک max_length برای آن تعریف کنید ,در سطح دیتابیس ,مقدار max_length اعمال نمی شود ولی در سطح جنگو این محدودیت اعمال خواهد شد (در ویجت).آرگومان های آن عبارتند از :آرگومان db_collection که اختیاری است و در واقع نام database collection برای این فیلد است .نکته : دیتابیس Oracle از collections برای TextFieldپشتیبانی نمی کنند .فیلد TimeField / class TimeField(auto_now=False, auto_now_add=False, **options) :یک شی از کلاس datetime.time که زمان را برای شما ذخیره خواهد کرد . آرگومان های یکسانی را با DateField دارد .همچنین فرم یا ویجت آن یک TimeInput است . در ادمین پنل چند میانبر جاوااسکریپتی نیز برای آن وجود دارد.فیلد URLField / class URLField(max_length=200, **options) :یک CharField برای یک URL که توسط URLValidator اعتبارسنجی می شود . (اعتبارسنجی یعنی اینکه مقدار URL بررسی می شود که معتبر است یا خیر)ویجت آن یک URLInput است . به یاد داشته باشید که مانند CharField این فیلد نیز max_length را دریافت می کند. اگر به آن چیزی را اختصاص ندهید ,آن را روی 200 تنظیم می کند .فیلد UUIDField / class UUIDField(**options) :کدهای UUID , رشته های رندومی با طول یکسان هستند که منحصر به فرد هستند و هیچ وقت به طور یکسان دو تا از آنها وجود ندارد .یک فیلد برای ذخیره UUID یا شناسه منحصر به فرد جهانی (برای موارد اعتبارسنجی کاربران کاربرد دارد یا اپاود فایل ها) که از کلاس UUID پایتون استفاده میکند . اگر از PostgreSQL استفاده کنید در یک فرمت uuid و در دیتابیس های دیگر در فرمت Char(32) ذخیره خواهد شد .معمولا این فیلد جایگزین خوبی برای AutoField های نوع primary_key است . این یعنی شما می توانید از آن به عنوان primary_key استفاده کنید . دیتابیس برای شما مقدار را تولید نخواهد کرد پس بهتر است در default آن را مقداردهی کنید . به مثال زیر نگاه کنید که به صورت اتوماتیک و رندوم آن را برای شما تولید می کند .import uuid from django.db import models class MyUUIDModel(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)در این جلسه به طور کامل به بررسی تمامی نوع های فیلد ها پرداختیم . در جلسه بعدی به بررسی فیلد های روابطی به طور کامل و با جزییات خواهیم پرداخت و سپس وارد مبحث ایندکس های دیتابیس خواهیم شد .