مدلهای جنگو ویژگیهای داخلی هستند که جنگو برای ایجاد جداول، فیلدها و محدودیتهای مختلف استفاده میکند. به طور خلاصه، مدلهای جنگو همان پایگاه داده SQL است که با جنگو استفاده میشود. SQL (زبان پرس و جوی ساختیافته) پیچیده است و شامل انواع مختلفی از کوئری برای ایجاد، حذف، بهروزرسانی و سایر عملیات مرتبط با پایگاه داده میشود. مدلهای جنگو این کارها را سادهتر کرده و جداول را به مدلها تبدیل میکنند. به طور کلی، هر مدل با یک جدول پایگاه داده مرتبط است.
مدلهای جنگو
در جنگو یک مدل ایجاد کنید تا به راحتی دادهها را در پایگاه داده ذخیره کنید. علاوه بر این، میتوانیم از پنل مدیریت جنگو برای ایجاد، بهروزرسانی، حذف یا بازیابی فیلدهای یک مدل و انجام عملیات مشابه استفاده کنیم. مدلهای جنگو سادگی، ثبات، کنترل نسخه و مدیریت متادیتای پیشرفته را فراهم میکنند. اصول پایهای یک مدل شامل موارد زیر است:
- هر مدل یک کلاس پایتون است که از `django.db.models.Model` ارث میبرد.
- هر ویژگی مدل نشاندهنده یک فیلد پایگاه داده است.
- با تمام این امکانات، جنگو یک API دسترسی به پایگاه داده بهطور خودکار تولید میکند.
مثال :
Python
from django.db import models
# Create your models here.
class RaadinoModel(models.Model):
title = models.CharField(max_length = 200)
description = models.TextField()
این برنامه یک مدل جنگو به نام "RaadinoModel" تعریف میکند که دو فیلد دارد: "title" و "description". فیلد "title" یک فیلد متنی با حداکثر طول ۲۰۰ کاراکتر است و "description" یک فیلد متنی بدون محدودیت طول است. این مدل میتواند برای ایجاد و تعامل با جدول پایگاه داده مربوطه برای ذخیرهسازی اشیاء "RaadinoModel" استفاده شود. بدون کد یا زمینه اضافی، اجرای این برنامه هیچ خروجی قابل مشاهدهای تولید نمیکند.
جنگو فیلدهای تعریفشده در مدلهای جنگو را به فیلدهای جدول پایگاه داده نقشهبرداری میکند، همانطور که در زیر نشان داده شده است.
مدل در فریموورک جنگو (django)
برای ایجاد مدلهای جنگو، ابتدا باید یک پروژه و یک اپلیکیشن در حال کار داشته باشید. پس از شروع یک اپلیکیشن، میتوانید مدلها را در فایل `app/models.py` ایجاد کنید. قبل از شروع به استفاده از یک مدل، بیایید ببینیم چگونه میتوان یک پروژه را آغاز کرد و یک اپلیکیشن به نام `raadino.py` ایجاد کرد.
ایجاد مدل در جنگو
Python
from django.db import models
class ModelName(models.Model):
field_name = models.Field(options)
برای ایجاد یک مدل، در فایل `raadino/models.py` کد زیر را وارد کنید:
python
from django.db import models
# اعلام یک مدل جدید با نام "RaadinoModel"
class RaadinoModel(models.Model):
# فیلدهای مدل
title = models.CharField(max_length=200)
description = models.TextField()
last_modified = models.DateTimeField(auto_now_add=True)
img = models.ImageField(upload_to="images/")
# تغییر نام نمونههای مدل با نام عنوان آنها
def __str__(self):
return self.title
این کد یک مدل جنگو جدید به نام "RaadinoModel" تعریف میکند که دارای چهار فیلد است:
- "title" (یک فیلد متنی با حداکثر طول ۲۰۰ کاراکتر)،
- "description" (یک فیلد متنی)،
- "last_modified" (یک فیلد تاریخ و زمان که به طور خودکار تاریخ و زمان ایجاد را تنظیم میکند)،
- "img" (یک فیلد تصویر که فایلها را در دایرکتوری به نام "images" آپلود میکند).
متد `__str__` نیز برای بازگرداندن عنوان نمونه مدل هنگام چاپ مدل تعریف شده است.
این کد هیچ خروجیای تولید نمیکند. بلکه یک کلاس مدل تعریف میکند که میتواند برای ایجاد جداول پایگاه داده و ذخیره دادهها در جنگو استفاده شود.
هر زمان که مدلی را ایجاد، حذف یا هر تغییری در فایل `models.py` پروژه خود ایجاد کنیم، باید دو فرمان `makemigrations` و `migrate` را اجرا کنیم.
- `makemigrations` اساساً دستورات SQL را برای اپلیکیشنهای از پیش نصب شده (که میتوانید آنها را در قسمت `INSTALLED_APPS` فایل `settings.py` مشاهده کنید) و مدل اپلیکیشن جدیدی که ایجاد کردهاید، تولید میکند.
- `migrate` این دستورات SQL را در فایل پایگاه داده اجرا میکند.
برای مثال، زمانی که این دستورات را اجرا کنیم:
- `python manage.py makemigrations` یک پرس و جوی SQL برای ایجاد مدل به عنوان یک جدول تولید میکند.
- `python manage.py migrate` جدول را در پایگاه داده ایجاد میکند.
حالا که یک مدل ایجاد کردهایم، میتوانیم عملیات مختلفی از جمله ایجاد یک ردیف در جدول (یا به عبارت دیگر ایجاد یک نمونه از مدل در جنگو) انجام دهیم.
نمایش مدل در رابط کاربری مدیریت جنگو
برای نمایش یک مدل در رابط کاربری مدیریت جنگو، باید فایل `admin.py` موجود در اپلیکیشن را تغییر دهیم. به فایل `admin.py` در اپلیکیشن `raadino` بروید و کد زیر را وارد کنید. مدل مربوطه را از `models.py` وارد کنید و آن را در رابط مدیریت ثبت کنید.
Python
from django.contrib import admin
# ثبت مدلهای خود در اینجا
from .models import RaadinoModel
admin.site.register(RaadinoModel)
این کد ماژول `admin` را از پکیج `django.contrib` و کلاس `RaadinoModel` را از ماژول `models` در دایرکتوری فعلی وارد میکند. سپس، کلاس `RaadinoModel` را در ادمین مدیریت جنگو ثبت میکند که این امکان را فراهم میسازد که مدل از طریق رابط کاربری مدیریت جنگو مدیریت شود.
این بدان معناست که شما میتوانید عملیات CRUD (ایجاد، خواندن، بهروزرسانی، حذف) را روی `RaadinoModel` با استفاده از رابط کاربری مدیریت جنگو انجام دهید.
این کد هیچ خروجیای تولید نمیکند، بلکه به سادگی `RaadinoModel` را با سایت مدیریت ثبت میکند تا بتوان آن را از طریق رابط کاربری مدیریت جنگو مدیریت کرد.
حالا میتوانیم بررسی کنیم که آیا مدل در رابط کاربری مدیریت جنگو نمایش داده شده است یا خیر. رابط کاربری مدیریت جنگو میتواند برای پیادهسازی گرافیکی عملیات CRUD (ایجاد، بازیابی، بهروزرسانی، حذف) استفاده شود.
عملیات CRUD در جنگو (django) – اضافه کردن، بهروزرسانی و حذف دادهها پایگاه داده
جنگو به ما اجازه میدهد تا با مدلهای پایگاه داده خود تعامل داشته باشیم، یعنی افزودن، حذف، تغییر و پرس و جو کردن اشیاء با استفاده از یک API انتزاعی پایگاه داده به نام ORM (Object Relational Mapper). ما میتوانیم به ORM جنگو دسترسی داشته باشیم با اجرای فرمان زیر در داخل دایرکتوری پروژه خود:
bash
python manage.py shell
افزودن اشیاء به دادههای مدل
برای ایجاد یک شیء از مدل و ذخیره آن در پایگاه داده، باید فرمان زیر را بنویسیم:
Python
a = RaadinoModel(
title = "Raadino Group",
description = "A description here",
img = "raadino/abc.png"
)
a.save()
بازیابی اشیاء از دیتابیس در جنگو
برای بازیابی تمامی اشیاء یک مدل، فرمان زیر را مینویسیم:
Python
GeeksModel.objects.all()
خروجی :
Python
<QuerySet [<ًRaadinoModel: Divide>, <RaadinoModel: Abbey Road>, <RaadinoModel: Revolver>]>
اصلاح اشیاء موجود در پایگاه داده جنگو با دستور shell
ما میتوانیم یک شیء موجود را به صورت زیر اصلاح کنیم:
Python
a = RaadinoModel.objects.get(id = 3)
a.title = "Pop"
a.save()
حذف اشیاء در مدل جنگو با استفاده از ترمینال
برای حذف یک شیء خاص، باید فرمانهای زیر را بنویسیم:
Python
a = Album.objects.get(id = 2)
a.delete()
برای بررسی پستهای مفصلتر درباره ORM جنگو میةوانید به ساختار MVT در جنگو مراجعه کنید.
اعتبارسنجی فیلدها در یک مدل django
اعتبارسنجیهای داخلی فیلدها در مدلهای جنگو اعتبارسنجیهای پیشفرضی هستند که به تمام فیلدهای جنگو از پیش اختصاص داده شدهاند. هر فیلد دارای اعتبارسنجیهای داخلی خاص خود است که از `Django validators` آمده است. به عنوان مثال، `IntegerField` دارای اعتبارسنجی داخلی است که تنها میتواند مقادیر صحیح را در یک محدوده خاص ذخیره کند.
کد زیر را در فایل `models.py` اپلیکیشن `raadino` وارد کنید:
Python
from django.db import models
from django.db.models import Model
class RaadinoModel(Model):
raadino_field = models.IntegerField()
def __str__(self):
return str(self.geeks_field)
پس از اجرای دستورات `makemigrations` و `migrate` در جنگو میتوانید این فیلد عددی را در داشبورد ادمین جنگو مشاهده کنید.
بررسی قابلیتهای مدلسازی در جنگو
در محیط مدیریت جنگو، زمانی که یک فیلد `IntegerField` تعریف میکنید، نمیتوانید یک رشته را در آن وارد کنید. به همین شکل، هر فیلد در جنگو دارای اعتبارسنجیهای پیشفرض خود است.
فیلدها و انواع داده در جنگو
مدلهای جنگو بخش بسیار مهمی از این فریمورک هستند که شامل فیلدهای مختلفی برای ذخیره دادهها در پایگاه داده میباشند. در اینجا لیستی از انواع فیلدهای پرکاربرد در جنگو آمده است:
نام فیلد | توضیحات |
---|---|
AutoField | فیلد عدد صحیح که به طور خودکار افزایش مییابد |
BigAutoField | فیلد عدد صحیح ۶۴ بیتی که به طور خودکار افزایش مییابد |
BigIntegerField | فیلد عدد صحیح ۶۴ بیتی. |
BinaryField | فیلدی برای ذخیره دادههای باینری خام. |
BooleanField | فیلد True/False با ویجت پیشفرض `CheckboxInput |
CharField | فیلد رشتهای برای ورودیهای کوچک تا بزرگ |
DateField | فیلد تاریخ که با `datetime.date` نشان داده میشود |
DateTimeField | فیلد تاریخ و زمان |
DecimalField | فیلد عددی با دقت ثابت که با `Decimal` نمایش داده میشود |
DurationField | فیلدی برای ذخیره دورههای زمانی |
EmailField | فیلد رشتهای که اعتبارسنجی ایمیل را انجام میدهد |
FileField | فیلدی برای بارگذاری فایل |
FloatField | فیلد عدد اعشاری که با `float` نمایش داده میشود |
ImageField | فیلدی برای بارگذاری تصویر که اعتبارسنجی تصویر را انجام میدهد |
IntegerField | فیلد عدد صحیح با مقادیر بین -2147483648 تا 2147483647 |
SlugField | فیلدی برای برچسبها که معمولاً در URLها استفاده میشود |
TextField | فیلد متنی بزرگ. |
TimeField | فیلد زمان که با `datetime.time` نمایش داده میشود. |
URLField | فیلدی برای URL با اعتبارسنجی. |
UUIDField | فیلدی برای ذخیره شناسههای منحصربهفرد. |
فیلدهای رابطهای در جنگو
جنگو مجموعهای از فیلدها را تعریف میکند که نمایانگر روابط بین مدلها هستند. این فیلدها برای تعریف ارتباطات مختلف بین جداول پایگاه داده استفاده میشوند.
نام فیلد | توضیحات |
---|---|
ForeignKey | رابطهی چند به یک. این فیلد نیاز به دو آرگومان موقعیتی دارد: کلاس مدلی که به آن مرتبط است و گزینهی `on_delete |
ManyToManyField | رابطهی چند به چند. نیاز به یک آرگومان موقعیتی دارد: کلاس مدلی که به آن مرتبط است. این فیلد مشابه `ForeignKey` عمل میکند و میتواند روابط بازگشتی و تنبل را نیز شامل شود |
OneToOneField | رابطهی یک به یک. این فیلد از نظر مفهومی مشابه `ForeignKey` با گزینهی `unique=True` است، اما در سمت "برعکس" این رابطه، مستقیماً یک شیء را بازمیگردان |
این فیلدهای رابطهای به شما امکان میدهند تا ارتباطات بین مدلهای مختلف را به صورت کارآمد و ساده در جنگو تعریف و مدیریت کنید.
گزینهها و ویژگیهای فیلدها در جنگو
گزینههای فیلد، آرگومانهایی هستند که به هر فیلد داده میشوند تا برخی محدودیتها یا ویژگیهای خاص را به آن فیلد اعمال کنند. برای مثال، اضافه کردن آرگومان `null=True` به `CharField` این امکان را فراهم میکند که مقادیر خالی به عنوان `NULL` در پایگاه داده ذخیره شوند. در ادامه، برخی از گزینهها و ویژگیهایی که یک `CharField` میتواند داشته باشد، آورده شده است.
نام فیلد | توضیحات |
---|---|
Null | اگر `True` باشد، جنگو مقادیر خالی را به عنوان `NULL` در پایگاه داده ذخیره میکند. مقدار پیشفرض `False` است |
Blank | اگر `True` باشد، اجازه میدهد که این فیلد خالی باشد. مقدار پیشفرض `False` است |
db_column | نام ستون پایگاه داده که برای این فیلد استفاده میشود. اگر تعیین نشود، جنگو از نام فیلد استفاده میکند |
Default | مقدار پیشفرض برای فیلد. این مقدار میتواند یک مقدار ثابت یا یک شیء قابل فراخوانی باشد. اگر قابل فراخوانی باشد، هر بار که یک شیء جدید ایجاد میشود، فراخوانی میشود |
help_text | متن کمکی اضافی که با ویجت فرم نمایش داده میشود. این برای مستندسازی مفید است حتی اگر فیلد شما در یک فرم استفاده نشود |
primary_key | اگر `True` باشد، این فیلد به عنوان کلید اصلی مدل عمل میکند |
editable | اگر `False` باشد، فیلد در پنل ادمین یا هر `ModelForm` دیگری نمایش داده نمیشود و همچنین در اعتبارسنجی مدل نادیده گرفته میشود. مقدار پیشفرض `True` است |
error_messages | این آرگومان به شما امکان میدهد پیامهای خطای پیشفرض را که فیلد ایجاد میکند، بازنویسی کنید. باید یک دیکشنری با کلیدهایی که با پیامهای خطای مورد نظر شما مطابقت دارند، ارسال کنید |
verbose_name | یک نام قابل خواندن برای انسان که برای فیلد استفاده میشود. اگر نام توضیحی داده نشود، جنگو به طور خودکار آن را با استفاده از نام فیلد ایجاد میکند و زیرخطها را به فاصلهها تبدیل میکند |
validators | لیستی از اعتبارسنجها که برای این فیلد اجرا میشوند. برای اطلاعات بیشتر به مستندات اعتبارسنجها مراجعه کنید |
Unique | اگر `True` باشد، این فیلد باید در کل جدول منحصر به فرد باشد. |
این گزینهها به شما اجازه میدهند تا فیلدهای مدلهای خود را در جنگو با دقت بیشتری تنظیم کنید و رفتار آنها را مطابق با نیازهای پروژهتان تغییر دهید.
ارتقاء مهارتهای برنامهنویسی وب با آموزشهای رادینو
آیا آمادهاید که مهارتهای برنامهنویسی وب خود را از سطح پایه به تخصص پیشرفته ارتقا دهید؟ آموزشهای رایگان ما در جنگو مطالعه کنید. این آموزشها برای توسعهدهندگان و برنامهنویسان طراحی شده است. همچنین با نوشتن نظر خود در بخش کامنتهای مقاله مدلها (models) در جنگو به ما در ادامه این مسیر کمک کنید.
ورود و ثبت نام برای ارسال نظر وارد شوید
¶ توضیحات مربوط به ORM جنگو خیلی مفید بود، لطفاً مثالهای بیشتری برای QuerySetها ارائه کنید.
¶ حتما
ممنون از بازخورد شما
ورود و ثبت نام برای ارسال نظر وارد شوید