تعریف مدل‌ها


در جنگو، امکان تعریف مدل‌های پایگاه داده تنها با استفاده از کد پایتون فراهم شده است — بدون نیاز به نوشتن حتی یک خط SQL. برای این کار، کافی است در فایل models.py داخل اپلیکیشن مربوطه، یک کلاس پایتونی ایجاد نموده که از کلاس django.db.models.Model ارث‌بری کند. هر کلاس معادل یک جدول در پایگاه داده خواهد بود و هر فیلد تعریف‌شده در آن، معادل یک ستون در جدول محسوب می‌شود.

coreapp/models.py

from django.db import models
import uuid

class project(models.Model):
    title = models.CharField(max_length=200)
    subject = models.CharField(max_length=500)
    content = models.TextField(null=True, blank=True)
    demo = models.URLField(null=True, blank=True)
    created = models.DateTimeField(auto_now_add=True)
    id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)

 

در جنگو، زمانی که کلاسی از models.Model ارث‌بری می‌کند، مشخص می‌کند که کلاس، یک مدل پایگاه داده است و نباید به عنوان یک کلاس معمولی پایتون در نظر گرفته شود. این ارث‌بری باعث می‌شود جنگو فیلدهای تعریف‌شده در کلاس را تحلیل کرده و بر اساس آن‌ها ساختار یک جدول در پایگاه داده را طراحی کند — با تعریف کلاس فوق، جنگو به‌صورت خودکار جدولی با نام coreapp_project (با توجه به نام اپلیکیشن) در دیتابیس ایجاد خواهد کرد. اما این فرآیند به‌صورت خودکار و فوری اتفاق نمی‌افتد؛ برای تبدیل مدل به جدول فیزیکی در دیتابیس، باید پس از تعریف مدل، ابتدا دستور python manage.py makemigrations را اجرا نموده تا جنگو تغییرات را شناسایی کرده و یک فایل migration در پوشه migrations/ اپلیکیشن — حاوی دستورات لازم برای ایجاد یا تغییر جدول — ایجاد کند، و سپس با اجرای دستور python manage.py migrate، این تغییرات در پایگاه داده اعمال شده و جدول مربوطه ساخته شود..

(venv) python manage.py makemigrations
(venv) python manage.py migrate

با اجرای دستورات، یک جدول با نام coreapp_project در دیتابیس ایجاد شده— که شامل ستون‌های created ،demo ،content ،subject  ،title و id خواهد بود.

جدول ایجاد شده به‌طور خودکار در پنل ادمین جنگو نمایش داده نخواهد شد. برای اینکه بتوان از طریق رابط کاربری ادمین (/admin) با داده‌های این مدل تعامل داشته باشیم — یعنی رکوردها را مشاهده، ایجاد، ویرایش یا حذف کنیم — باید مدل را در سیستم مدیریت جنگو ثبت — register — نماییم. این کار با ویرایش فایل admin.py درون دایرکتوری اپلیکیشن مربوطه انجام می‌شود. کافی‌ست مدل مورد نظر را وارد کرده و با استفاده از متد admin.site.register() آن را در پنل ادمین ثبت نمود.

coreapp/admin.py

from django.contrib import admin
from . import models

# Register your models here.
admin.site.register(models.project)

 

حال، پنل ادمین جنگو — Admin Interface — به‌صورت خودکار و بدون نیاز به نوشتن هیچ کد اضافی، امکانات کامل برای مدیریت داده‌های مدل project را در اختیار قرار می‌دهد که می‌توان رکوردها را مشاهده، ایجاد، ویرایش یا حذف نمود— دقیقاً همان‌طور که در سیستم‌های مدیریت محتوا یا پنل‌های مدیریتی حرفه‌ای انتظار می‌رود. این ویژگی، جنگو را به ابزاری بسیار کاربردی برای توسعه سریع و مدیریت روزمره داده‌ها تبدیل می‌کند.

در صورت اقدام برای ایجاد آیتم­های پروژه از اینترفیس ادمین، با کلیک بر روی گزینه + Add تصویری همانند شکل ذیل مطابق با فیلدهای تعریف شده در مدل project خواهیم داشت. فیلدهای create و id به دلیل اینکه به­صورت خودکار اضافه می­شوند در لیست فیلدها مشاهده نمی­گردند

در صورتی که از طریق پنل ادمین جنگو اقدام به ایجاد رکورد جدیدی از مدل project کنیم — با کلیک بر روی دکمه + Add Project — فرمی نمایش داده می‌شود که فیلدهای آن دقیقاً مطابق با فیلدهای تعریف‌شده در مدل خواهد بود.. باید توجه داشت که فیلدهایی مانند id (کلید اصلی) و created (در صورت استفاده از auto_now_add=True) در این فرم نمایش داده نمی‌شوند، زیرا مقادیر آن‌ها به‌صورت خودکار توسط جنگو تولید و مدیریت می‌شوند و نیازی به ورود دستی توسط کاربر ندارند.

پس از افزودن رکوردهای جدید به مدل project از طریق پنل ادمین، ممکن است نحوه نمایش این آیتم‌ها در لیست مدل‌ها، کمی عجیب و یا غیرکاربردی به نظر برسد — چرا که جنگو به‌صورت پیش‌فرض، هر نمونه (instance) از مدل را با یک رشته عمومی مانند project object (0516b...) نمایش می‌دهد که فقط شامل نام کلاس و شناسه منحصربه‌فرد (UUID) آن است.

این نحوه نمایش برای کاربران ادمین — و حتی توسعه‌دهندگان — کاربردی نبوده و تشخیص رکوردها را دشوار می‌کند. برای رفع این موضوع و نمایش اطلاعات معنادار (مانند عنوان پروژه)، باید در کلاس مدل، متد استاندارد __str__ (در پایتون ۳) را تعریف نموده تا جنگو بتواند یک نمایش خوانا و معنادار از هر رکورد را در پنل مدیریت یا هر جای دیگری که نیاز به نمایش متنی مدل باشد، ارائه دهد.

 

coreapp/models.py

class project(models.Model):
    title = models.CharField(max_length=200)
    subject = models.CharField(max_length=500)
    content = models.TextField(null=True, blank=True)
    demo = models.URLField(null=True, blank=True)
    created = models.DateTimeField(auto_now_add=True)
    id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)

    def __str__(self):
        return self.title

پس از تعریف متد __str__ در مدل project و بازگرداندن فیلدی معنادار (مانند title)، با بازگشت به پنل ادمین جنگو، مشاهده خواهد شد که رکوردهای ایجادشده به‌صورت title به‌عنوان نمایش خوانا و قابل‌درک از هر رکورد در لیست‌ها، منوها و فرم‌های انتخاب ظاهر می‌شود. این تغییر ساده، تجربه کاربری در پنل مدیریت را به‌طور چشمگیری بهبود بخشیده و مدیریت داده‌ها را برای کاربران ادمین، شفاف‌تر و کارآمدتر می‌کند.