فیلدهای عمومی و کمکی (Generic & Helper Fields)
این فیلدها معمولاً برای مدیریت زیرساخت مدل یا ذخیره اطلاعات سیستمی استفاده میشوند. بعضی از آنها بهصورت خودکار توسط جنگو ایجاد میشوند (مثل id) و بعضی برای موارد خاص طراحی شدهاند.
الف) AutoField / BigAutoField
-
- فیلد عددی که بهصورت خودکار افزایش مییابد.
- معمولاً به عنوان
idپیشفرض در هر مدل بصورت خودکار توسط جنگو استفاده میشود و نیازی به تعریف دستی ندارد.
ب) UUIDField
-
- ذخیره شناسههای منحصربهفرد جهانی.
- مناسب برای مواردی که
idعددی قابل حدس نباشد. - نیازمند بکارگیری کتابخانه
uuidاست.
ج) GenericIPAddressField
-
- ذخیره آدرس IP (هم IPv4 و هم IPv6).
د) BinaryField
-
- ذخیره دادههای باینری خام — مثل فایلهای رمزگذاری شده یا بایتها.
- محدودیت در استفاده در فرمها و فیلترها دارد.
import uuid
class smaple(models.Model):
id = models.BigAutoField(primary_key=True)
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
ip_address = models.GenericIPAddressField()
encrypted_data = models.BinaryField()
هـ) GenericForeignKey (از django.contrib.contenttypes)
-
- برای ایجاد رابطه به مدلهای مختلف — مکانیزم “Generic Relation” (مانند سیستم کامنت که برای مدلهای مقاله، محصول و ... کار کند).
- نیازمند دو فیلد کمکی (
content_typeوobject_id) است. content_type: مشخص میکند که رکورد مربوط به کدام مدل است (مثلاًArticleیاProduct)object_id: مشخص میکند که رکورد مربوط به کدامidاز آن مدل استcontent_object: یک فیلد مجازی (غیر فیزیکی) که به شما اجازه میدهد مستقیماً به شیء مرتبط دسترسی داشته باشید.
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
class Comment(models.Model):
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) # Refer to Model (Article, Product, ...)
object_id = models.UUIDField() # Refer to Model.Object.id
content_object = GenericForeignKey('content_type', 'object_id') # "content_type" & "object_id" Combination to access the object directly
comment = models.TextField()
created = models.DateTimeField(auto_now_add=True)
⚠️ اگر در مدل مقصد (مثلاً Article) از UUIDField به عنوان id بجای AutoField پیشفرض جنگو استفاده گردد، باید فیلد object_id در مدل Comment نیز از PositiveIntegerField به UUIDField تغییر داده شود — در غیر این صورت، با خطا مواجه خواهیم شد.