در ادامه بخش اول میکرونکات جنگو در این مطلب نکات مهمی که درباره فایل models داریم رو بیان میکنم و امیدوارم براتون مفید باشه.
models.py:
def get_absolute_url(self): return reverse('post-detail', args=[str(self.id)])
اگر این متد رو داخل مدل ها پیاده سازی کرده باشیم، در صورتی که از Template استفاده میکنیم میتونیم به جای
{% 'post_detail' post.pk %}
از
{% post.get_absolute_url %}
استفاده کنیم.
برای جواب دادن به این سوال پیشنهاد میکنم این پست استک اورفلو رو بخونید.
به طور خلاصه null=True مربوط به نگهداری مقادیر در دیتابیس هست که ما اجازه میدیم تا مقادیر null در دیتابیس ذخیره بشن. اما blank=True مربوط به مرحله validation فیلدها است که مشخص میکنه آیا این فیلد required هست یا خیر.
استفاده همزمان null=True و blank=True خیلی اتفاق می افته و دلیلش هم اینه که وقتی ما یک فیلد رو غیر الزامی تعیین میکنیم (blank=True) در نتیجه این اجازه رو هم باید به دیتابیس بدیم تا مقادیر null رو ذخیره کنه. تنها استثنا این موضوع در مورد CharField و TextField هست که در صورتی که خالی باشند به صورت یک string خالی یا ' ' داخل دیتابیس ذخیر میشن.
راه حلی که اینجا جنگو به ما میده قابلیت اییه که بهش میگیم foo_set در اینجا foo معادل با مدل پست های ما است یعنی مثلا post_set که از این طریق داخل کوئری هامون میتونیم به FKها دسترسی داشته باشیم.
روش دیگه تعریف کردن related_name عه مثلا:
class Comment(models.Model): post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
بهتره related_name اسم جمع اون مدل ایی باشه که FK درونش قرار داره.
خیلی از جاها ما این دوتا رو به جای هم استفاده می کنیم چون به صورت پیش فرض جنگو موقع ایجاد جدول های دیتابیس یک فیلد id ایجاد می کنه و اون رو به عنوان pk یا همون primary key در نظر میگیره.
اما ما این قابلیت رو داریم که فیلد دیگه ایی رو (بغیر از id) بعنوان pk در نظر بگیریم. در نتیجه استفاده از pk به جای id روش safe تری محسوب میشه و تشخیص اینکه کدوم فیلد بعنوان pk در نظر گرفته شده بعهده خود جنگوست.
author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, related_name='posts')
من سروش ذاکر شبیری هستم و ممنونم که این مطلب رو مطالعه کردید. در صورتی که سوال یا پیشنهادی داشتید خوشحال میشم که اون رو از طریق راه های زیر با من در میون بزارید. :)
اگر این مطلب رو دوست داشتید می تونید بخش اول رو در این لینک بخونید.