فیلدهای عمومی و کمکی (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 تغییر داده شود — در غیر این صورت، با خطا مواجه خواهیم شد.