تایپ‌ها


وقتی در فریمورک جنگو شروع به ساخت مدل‌های داده‌ای می‌کنیم، اولین و مهم‌ترین تصمیمی که باید بگیریم، انتخاب تایپ فیلد (Field Type) مناسب برای هر ستون داده است. فیلدها در جنگو نه‌تنها ساختار داده‌ها را در پایگاه داده مشخص می‌کنند، بلکه نحوه نمایش، اعتبارسنجی، ذخیره‌سازی و حتی رفتار در فرم‌ها و پنل ادمین را نیز تعیین می‌کنند. در این بخش، به بررسی تمامی انواع رایج و پیشرفته فیلدهای جنگو می‌پردازیم — از ساده‌ترین‌ها تا فیلدهای رابطه‌ای و سفارشی.

🔹 فیلدها چه نقشی دارند؟

در تعریف مدل اشاره شد که هر مدل (Model) یک کلاس پایتونی است که از django.db.models.Model ارث‌بری می‌کند. هر فیلد در این کلاس نیز، یک ویژگی (attribute) است که نمونه‌ای از یکی از کلاس‌های موجود در django.db.models را نگه می‌دارد — مثل CharField یا ForeignKey. این فیلدها ...

  • در زمان اجرای makemigrations و migrate به ستون‌های جدول در دیتابیس تبدیل می‌شوند.
  • در فرم‌های خودکار (ModelForm) و پنل ادمین، ویجت‌های مناسب را ایجاد می‌کنند.
  • اعتبارسنجی داده‌ها را بر اساس نوع و پارامترها انجام می‌دهند.
  • امکان اعمال محدودیت‌های دیتابیسی (مثل UNIQUE, NOT NULL) را فراهم می‌کنند.

انتخاب نوع صحیح فیلد، تأثیر مستقیمی بر کارایی، صحت داده‌ها و تجربه کاربری خواهد داشت.

🧱 دسته‌بندی کلی فیلدها

فیلدهای جنگو را می‌توان به چند دسته کلی تقسیم کرد:

  1. فیلدهای اسکالر (مقادیر ساده) — مثل متن، عدد، تاریخ
  2. فیلدهای رابطه‌ای — برای اتصال مدل‌ها به هم
  3. فیلدهای ساختاریافته و خاص — مثل فایل، تصویر، JSON
  4. فیلدهای عمومی و کمکی — مثل AutoField, GenericIPAddressField

در ادامه، هر دسته را به‌صورت جزء به جزء بررسی می‌کنیم.

فیلدهای اسکالر (Scalar Fields)


فیلدهای اسکالر، ساده‌ترین و رایج‌ترین نوع فیلدها هستند که مقادیر ساده را ذخیره می‌کنند — یعنی هر فیلد فقط یک مقدار ساده (مثل متن، عدد، تاریخ یا بولین) را نگه می‌دارد. این فیلدها مستقیماً به ستون‌های ساده در دیتابیس تبدیل می‌شوند.

الف) فیلدهای متنی:

  • CharField: برای رشته‌های کوتاه با طول مشخص (max_length اجباری است).
  • TextField: برای متن‌های بلند — بدون محدودیت طول.
  • EmailField: اعتبارسنجی ایمیل + محدودیت طول.
  • SlugField: برای URLها — فقط حروف، اعداد، خط تیره و زیرخط.
  • URLField: اعتبارسنجی آدرس اینترنتی.
 

ب) فیلدهای عددی:

  • IntegerField, BigIntegerField, SmallIntegerField: اعداد صحیح با دامنه‌های مختلف.
  • PositiveIntegerField, PositiveSmallIntegerField: فقط اعداد مثبت.
  • DecimalField: اعداد اعشاری با دقت بالا — مناسب امور مالی.
  • FloatField: اعداد اعشاری با دقت متوسط (با خطای گرد کردن).
 

ج) فیلدهای تاریخ و زمان:

  • DateField: فقط تاریخ (YYYY-MM-DD)
  • DateTimeField: تاریخ + زمان
  • TimeField: فقط زمان (HH:MM:SS)
 

د) فیلدهای بولین و انتخابی:

  • BooleanField: True/False
  • choices: برای محدود کردن مقادیر مجاز (مثلاً وضعیت‌ها)

 

class Sample(models.Model):
    name = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    created_at = models.DateTimeField(auto_now_add=True)
    is_available = models.BooleanField(default=True)
    status = models.CharField(max_length=20, choices=(('ON', 'Active'), ('OFF', 'Inactive')))

 

فیلدهای رابطه‌ای (Relational Fields)


این فیلدها برای ایجاد رابطه بین مدل‌ها استفاده می‌شوند و در پایگاه داده به صورت کلید خارجی (Foreign Key) یا جدول واسط (Intermediate Table) پیاده‌سازی می‌شوند. هدف اصلی: جلوگیری از تکرار داده و ایجاد ساختار رابطه‌ای بین موجودیت‌ها.

الف) ForeignKey — رابطه یک-به-چند

  • یک رکورد در مدل A به چند رکورد در مدل B اشاره می‌کند. (مثال: یک نویسنده — چند مقاله)
  • on_delete اجباری است — تعیین می‌کند در صورت حذف رکورد والد چه اتفاقی بیفتد.
 

ب) OneToOneField — رابطه یک-به-یک

  • یک رکورد در مدل A فقط به یک رکورد در مدل B متصل است. (مثال: کاربر — پروفایل کاربری.)
 

ج) ManyToManyField — رابطه چند-به-چند

  • چند رکورد در مدل A به چند رکورد در مدل B متصل می‌شوند. (مثال: مقاله — تگ‌ها.)
 
class Smaple(models.Model):
    author = models.ForeignKey('Author', on_delete=models.CASCADE)
    profile = models.OneToOneField('UserProfile', on_delete=models.CASCADE)
    tags = models.ManyToManyField('Tag', blank=True)

🧩 می‌توان جدول واسط را خودتان تعریف کنید (through=) برای ذخیره اطلاعات اضافی در رابطه.

 

💡 کاربرد:

  • مدل‌سازی روابط معنادار بین موجودیت‌ها (مثل کاربر-سفارش، محصول-دسته‌بندی)
  • جلوگیری از تکرار داده و حفظ یکپارچگی داده‌ها (Data Integrity)
  • امکان پیمایش معکوس رابطه با related_name
 

فیلدهای ساختاریافته و خاص (Structured & Specialized Fields)


این فیلدها برای ذخیره داده‌های مرکب، باینری یا رسانه‌ای طراحی شده‌اند. برخلاف فیلدهای اسکالر، این فیلدها ممکن است شامل چند بخش باشند یا نیاز به پردازش خاصی (مثل آپلود فایل یا تجزیه JSON) داشته باشند.

الف) FileField و ImageField

  • برای آپلود فایل و تصویر.
  • نیاز به تنظیم MEDIA_URL و MEDIA_ROOT دارند.
  • ImageField نیازمند کتابخانه Pillow است.

 

ب) JSONField

  • برای ذخیره داده‌های JSON — بسیار منعطف.
  • پشتیبانی از کوئری‌های داخل JSON در دیتابیس‌های مدرن (مثل PostgreSQL).
  • مناسب برای: تنظیمات پویا، لاگ‌های ساختاریافته، داده‌های متغیر بین رکوردها.
 

ج) ArrayField (فقط در PostgreSQL)

  • ذخیره لیستی از مقادیر
  • مثال: لیست تلفن‌های یک کاربر.
  • فقط در PostgreSQL پشتیبانی می‌شود.
 
class Smaple(models.Model):
    avatar = models.ImageField(upload_to='avatars/')
    resume = models.FileField(upload_to='resumes/')
    metadata = models.JSONField(default=dict)
    phones = models.ArrayField(models.CharField(max_length=10))
 

د) HStoreField (فقط در PostgreSQL — قدیمی‌تر)

  • ذخیره داده‌های key-value — جایگزین قدیمی‌تر برای JSONField.
 

فیلدهای عمومی و کمکی (Generic & Helper Fields)


این فیلدها معمولاً برای مدیریت زیرساخت مدل یا ذخیره اطلاعات سیستمی استفاده می‌شوند. بعضی از آن‌ها به‌صورت خودکار توسط جنگو ایجاد می‌شوند (مثل id) و بعضی برای موارد خاص طراحی شده‌اند.

الف) AutoField / BigAutoField

  • فیلد عددی که به‌صورت خودکار افزایش می‌یابد.
  • معمولاً به عنوان id پیش‌فرض در هر مدل استفاده می‌شود.

ب) UUIDField

  • ذخیره شناسه‌های منحصربه‌فرد جهانی.
  • مناسب برای مواردی که نمی‌خواهید id عددی قابل حدس باشد.
  • حتما باید کتابخانه uuid با دستور import 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) است.