مدل یا همان Model

جنگو

سلام

مدل‌ها، نمایی از دیتابیس ما هستند. یعنی مدل هایی که ما تعریف می کنیم در دیتابیس مفهوم جداول ما را پیدا می کنند.

برای نوشتن این برنامۀ آموزشی به تعریف چهار کلاس احتیاج داریم. topic, board, post & user که البته کلاس یوزر به صورت حرفه‌ای در جنگو پیاده‌سازی شده و نام app آن auth است. این اپ از قبل در INSTALLED_APPS درج شده و name space آن django.contrib.auth است.

برای هر اپ باید مدل آن را در فایل مربوطه بسازیم. یعنی در اپِ بورد در فایل models.py (که از قبل وجود دارد) کلاس های زیر را وارد می‌کنیم:

from django.db import models
from django.contrib.auth.models import User

class Board(models.Model):
    name = models.CharField(max_length=30, unique=True)
    description = models.CharField(max_length=100)

class Topic(models.Model):
    subject = models.CharField(max_length=255)
    last_updated = models.DateTimeField(auto_now_add=True)
    board = models.ForeignKey(Board, related_name='topics')
    starter = models.ForeignKey(User, related_name='topics')

class Post(models.Model):
    message = models.TextField(max_length=4000)
    topic = models.ForeignKey(Topic, related_name='posts')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(null=True)
    created_by = models.ForeignKey(User, related_name='posts')
    updated_by = models.ForeignKey(User, null=True, related_name='+')

در جنگو تمام کلاس‌ها، زیرکلاسِ db.models.Model به حساب می‌آیند و دوم اینکه تمام کلاس ها باید در قالب جداول دیتابیس انتقال یابد. هر فیلد هم با django.db.models.Field تعیین می شود. یعنی با این کار می توانیم فیلدها را استاندارد تعریف کنیم و خودش به صورت خودکار columnهای دیتابیس را تنظیم می کند.

توضیح فیلدها:

    • CharField , TextField , IntegerField , ,BooleanField , DecimalField , DateTimeField انواع داده می‌باشند.
    • max_length برای برخی فیلدها حتماً طول آن باید مشخص شود. مثل سایز فیلد CharField
    • تنطیمِ unique=True به دیتابیس اجبار می کند تا مقدار دیتا به صورت یکتا و یونیک باشد.
    • auto_now_add=True تاریخ و ساعت اضافه شدن فیلد را به صورت خودکار در آن ردیف قرار می دهد.
    • ForeignKey می توان یک کلاس را به کلاس دیگر ارتباط داد. این ارتباط از نوع یک به چند بوده و در سطح دیتابیس تعریف می شود. برای مثال در مدل تاپیک، فیلدی وجود دارد با نام board و این فیلد از نوع ForeignKey می‌باشد. یعنی هر تاپیک را دقیقا به یک بورد نسبت می دهد. به تعبیر دیگر هر تاپیک دقیقا متعلق به یک بورد است اما یک بورد شامل تعداد زیادی تاپیک می‌شود.
    • related_name: از آن استفاده می کنیم تا ارتباطات معکوس به دست بیایند. یعنی یک بورد به چند تاپیک مربوط می شود. جنگو به صورت اتوماتیک این لینک معکوس را ایجاد می کند اما اگر نام آن را به صورت دستی تنظیم نکنیم؛ نام پیش فرضی متشکل از class_name)_set) را برای آن در نظر می گیرد. برای مثال در همین کلاس اگر برای قسمت تاپیک این عبارت را مقدار دهی نمی کردیم به صورت پیش فرض آن را برابر با topic_set قرار می داد. ما نام آن را topics قرار دادیم تا خواناتر باشد.
    • ‘+’=related_name اگر مقدار آن را با + تنظیم کنیم یعنی به جنگو گفته ایم که این مورد به (reverse relationship) نیاز ندارد.
    • Primary keys/IDs: جنگو به صورت خودکار آن را برای ما می سازد.

ترجمه اختصاصی توسط تمدن

 

مطلب بعدی: مهاجرت مدل ها | Migration the Models

مطلب قبلی: شمای کلی برنامه | Wireframes

بدون دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

جنگو
پیکربندی گواهینامۀ https

سلام حالا می خواهیم برنامۀ خودمان را با گواهینامۀ https امن کنیم. ساده ترین کار برای انجام آن Let’s Encrypt است. قبل از Let’s Encrypt هرگز تنظیمات https به این راحتی نبوده و مهمتر اینکه اینکار کاملاً رایگان است. آن ها راه حلی به نام certbot را ارائه داده اند …

جنگو
پیکربندی سرویس ایمیل

سلام یکی از بهتر سرویس دهنده های ایمیل Mailgun با قابلیت ۱۲ هزار ایمیل رایگان در ماه است. به صورت رایگان ثبت نام کنید. برای اینکار باید آن را با سرویس دهندۀ دامین خود تنظیم کنید که در این آموزش از tamadon.org استفاده شده است. حالا اولین رکورد DNS را …

جنگو
پیکربندی NGINX

سلام کار بعدی که قرار است انجام شود؛ تنظیمان Nginx به شکلی است که پاسخگویی و سرویس دهی مربوط به فایل های استاتیک را خود انجام دهد و سایر درخواست ها را به Gunicorn بفرستد. یک فایل پیکربندی با نام boards را درون /etc/nginx/sites-available/ و با محتوای زیر اضافه می …

هرگونه استفادۀ از این آموزش به صورت رایگان و با ارجاع به تمدن جایز است.