7-جنگو در یک نگاه (مدل جنگو)

جنگو در ابتدا برای استفاده در یک محیط خبری با سرعت بالا توسعه داده شد. به همین دلیل، این فریمورک بهگونهای طراحی شده است که رایجترین وظایف توسعه وب را سریع، ساده و کارآمد انجام دهد.
در این بخش، یک نمای کلی و غیررسمی از نحوهی ساخت یک وباپلیکیشن مبتنی بر پایگاه داده با جنگو ارائه میشود. هدف این معرفی، آموزش کامل یا ارائهی یک مرجع جامع نیست، بلکه تنها یک درک کلی از نحوهی کار جنگو را فراهم میکند.
اگر قصد دارید پروژهای با جنگو آغاز کنید، پیشنهاد میکنیم آموزش گامبهگام این دوره را را دنبال کنید.
طراحی مدلهای داده در جنگو (دیتابیس)
در بخش «جنگو در یک نگاه»، هدف آموزش کامل کار با جنگو نیست، بلکه تلاش شده به سادهترین و سریعترین شکل ممکن یک پروژهی ابتدایی پیادهسازی شود تا کارآموز بتواند در کوتاهترین زمان، درک کلی از اجزای مختلف جنگو پیدا کرده و با آنها آشنا شود.
در جنگو، استفاده از پایگاه داده اختیاری است، اما این فریمورک یک ORM (Object-Relational Mapper) قدرتمند ارائه میدهد که امکان تعریف و مدیریت پایگاه داده را مستقیماً با کد پایتون فراهم میکند. بهجای کار با جداول دیتابیس و دستورات پیچیدهی SQL، یا دیگر دیتابیسهای معروف، میتوانید با استفاده از کلاسهای پایتون بهسادگی ساختار دادهها را تعریف و کنترل کنید.
تعریف مدلها در جنگو
جنگو یک سینتکس ساده و منعطف برای تعریف مدلهای پایگاه داده ارائه میدهد که طی سالها، بسیاری از چالشهای طراحی دیتابیس را برطرف کرده است. در ادامه، نمونهای از یک فایل models.py
شامل دو مدل Reporter (برای تعریف خبرنگار) و Article (برای تعریف خبر ) را بررسی میکنیم:
مدل Reporter
(گزارشگر):
from django.db import models
class Reporter(models.Model):
full_name = models.CharField(max_length=70)
def __str__(self):
return self.full_name
- فیلد
full_name
نام گزارشگر را در قالب یک رشته متنی (CharField) ذخیره میکند. - متد
__str__
مقدار خوانایی برای نمایش در پنل ادمین یا محیط کنسول برمیگرداند.
مدل Article
(مقاله خبری):
class Article(models.Model):
pub_date = models.DateField()
headline = models.CharField(max_length=200)
content = models.TextField()
reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
def __str__(self):
return self.headline
pub_date
: تاریخ انتشار مقاله را ذخیره میکند.headline
: عنوان مقاله را در قالب یک رشته متنی ذخیره میکند.content
: محتوای مقاله را در قالب متن بلند (TextField) ذخیره میکند.reporter
: با استفاده از کلید خارجی (ForeignKey
) به مدلReporter
متصل است. این فیلد مشخص میکند که هر مقاله متعلق به کدام گزارشگر است.on_delete=models.CASCADE
: در صورت حذف یکReporter
، تمام مقالههای مرتبط با او نیز حذف خواهند شد.- متد
__str__
مقدارheadline
را برمیگرداند تا نمایش خواناتری از مدل داشته باشیم.
نصب مدل
برای ایجاد خودکار جداول پایگاه داده، از دستورات خط فرمان جنگو استفاده کنید. کافی است دستورات زیر را بهصورت جداگانه در ترمینال پروژه اجرا کنید: (فراموش نکنید که اگر از vs code استفاده می کنید قبل از استفاده از ترمینال محیط مجازی را فعال کنید برای مشاهده نحوه فعال سازی به جلسه ایجاد محیط مجازی بروید.)
py manage.py makemigrations
py manage.py migrate
دستور makemigrations تمام مدلهای موجود را بررسی میکند و برای جداولی که هنوز ایجاد نشدهاند، فایلهای مهاجرت (migrations) میسازد.
دستور migrate این مهاجرتها را اجرا میکند و جداول مربوطه را در پایگاه داده ایجاد مینماید. علاوه بر این، امکان مدیریت پیشرفتهتر ساختار پایگاه داده را نیز فراهم میکند.
بهطور خلاصه، ساختار دیتابیسی که با دستورات پایتون در فایل مدل تعریف شده است، با اجرای این دو دستور به کدهای SQL ترجمه شده و در پایگاه داده اعمال میشود.
توجه داشته باشید که هر زمان تغییری در مدلهای موجود ایجاد کردید یا مدل جدیدی اضافه نمودید، لازم است این دو دستور را مجدداً اجرا کنید تا تغییرات در پایگاه داده اعمال شوند.
جنگو بهصورت پیشفرض صفحات مدیریتی (Admin) آمادهای دارد که میتوان از آنها برای اضافه کردن، ویرایش، یا مدیریت دادههای موجود در پایگاه داده استفاده کرد.
در جلسات بعدی بهطور مفصل به فایل admin.py خواهیم پرداخت، اما اگر میخواهید امکان مدیریت دادههای این مدل را در صفحه ادمین داشته باشید؛ کافی است دستور زیر را به فایل admin.py پروژه اضافه کنید:
from django.contrib import admin
from .models import Article
# Register your models here.
admin.site.register(Article)
نتیجهگیری
در جنگو، مدلها قلب برنامه شما هستند و تعریف آنها با استفاده از ORM باعث سادگی، خوانایی و مدیریت بهینهی دادهها میشود. این روش نیاز به نوشتن مستقیم SQL را کاهش داده و فرآیند توسعه را سریعتر و کارآمدتر میکند.
0 دیدگاه