برنامه نویسی ۲۰۱۸ بازدید

در این مقاله در خصوص استفاده از مدل های پایگاه داده در پایتون و جنگو توضیحاتی ارائه می‌کنیم. مراحل کار به شرح زیر هستند:

  • ایجاد مدل‌‌های جدید برای پردازش داده‌ها.
  • افزودن مدل‌ها به اینترفیس ادمین.
  • ایجاد، ویرایش فیلتر و حذف اطلاعات در مدل‌ها.
  • ارتقای مدل‌ها با خصوصیت‌ها و متدها.
  • یکپارچه‌سازی داده‌ها در اپلیکیشن.

ایجاد مدل پایگاه داده

در جنگو امکان ساخت مدل‌های پایگاه داده با استفاده از کد پایتون وجود دارد. به این منظور باید فایل models.py را درون پوشه اپلیکیشن (example/models.py) ایجاد کنید:

from django.db import models

# Create your models here.

class Sender(models.Model):
    name = models.CharField(max_length=200)
    email = models.CharField(max_length=200)
    imageUrl = models.CharField(max_length=250)
    def __str__(self):
        return self.name

class Message(models.Model):
    sender = models.CharField(max_length=200)
    recipient = models.CharField(max_length=200)
    message = models.CharField(max_length=200)
    visible = models.IntegerField(default=1)
    timestamp = models.DateTimeField('date created')
    def __str__(self):
        return self.message

این کد موجب ایجاد 2 جدول به نام‌های senders و messages می‌شود. در هر یک از این جدول‌ها می‌توان فیلدهایی را با استفاده از متدهای شیء models تعریف کرد.

  • متد ()CharField برای فیلدهای متنی با یک «طول بیشینه» (max_length) تعریف شده.
  • متد ()IntegerField برای مقادیر صحیح با یک مقدار default.
  • متد ()DateTimeField برای ذخیره‌سازی تاریخ/زمان.

متد str__(self)__ برای دریافت یک بازنمایی string از شیء استفاده می‌شود. در هر حالت می‌توانید از فیلد یا ترکیبی از مقادیر استفاده کنید.

ایجاد و اجرای میگریشن‌ها

اینک می‌توانید جدول‌های تعریف شده در فایل models.py را با ایجاد یک فایل migration ایجاد کنید. این فایل برای اجرای فرایند ایجاد هر جدول مورد استفاده قرار می‌گیرد.

python manage.py makemigrations
Migrations for 'example':
example/migrations/0001_initial.py
- Create model Message
- Create model Sender

به این ترتیب یک فایل جدید به نام example/migrations/0001_initial.py ایجاد می‌شود که شامل دستورهایی برای ایجاد جداول است. گام بعدی اجرای میگریشن است:

python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, example, sessions
Running migrations:
  Applying example.0001_initial... OK

سپس جدول‌های جدید در پایگاه داده SQLite ایجاد می‌شوند. اگر علاقه‌مند هستید ببینید کد میگریشن در SQL ساده به چه شکل است، می‌توانید از دستور sqlmigrate زیر استفاده کنید:

python manage.py sqlmigrate example 0001

این دستور یک فهرست از دستورهای SQL نمایش می‌دهد:

BEGIN;
--
-- Create model Message
--
CREATE TABLE "example_message" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "sender" varchar(200) NOT NULL, "recipient" varchar(200) NOT NULL, "message" varchar(200) NOT NULL, "visible" integer NOT NULL, "timestamp" datetime NOT NULL);
--
-- Create model Sender
--
CREATE TABLE "example_sender" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "email" varchar(200) NOT NULL, "imageUrl" varchar(250) NOT NULL);
COMMIT;

توجه کنید که خروجی فوق ممکن است بسته به نسخه‌های مختلف پایگاه داده SQLite متفاوت باشد.

استفاده از عملیات پایگاه داده جنگو

به جای اجرای دستورهای خاص و پیچیده SQL می‌توان با تابع‌های پایگاه داده ارائه شده از سوی جنگو و پایتون کار کرد. به این ترتیب می‌توانید یک کنسول خاص پایتون آغاز کنید که آماده کار با اپلیکیشن و مدل‌ها است:

python manage.py shell

اکنون کنسولی دارید که دستورهای پایتون را اجرا می‌کند. برخی دستورهای مفید که می‌توان اجرا کرد به صورت زیر هستند:

from example.models import Sender, Message
from django.utils import timezone

خط اول اشیای Sender و Message مرتبط با جدول‌های ایجاد شده در میگریشن را ایمپورت می‌کند. خط دوم شیء timezone را برای کار با عملیات تاریخ/زمان ایمپورت می‌کند.

ایجاد مدل‌ها

sender = Sender(email="me@example.com", name="Me Myself", imageUrl = "http://my/image.png")
sender.save()
sender.id

این خطوط یک شیء Sender جدید ایجاد می‌کنند و مقادیر آن‌ها را پر می‌کنند. سپس متد save()‎ برای ذخیره این آیتم در پایگاه داده فراخوانده می‌شود. در نهایت sender یک ID جدید دارد که پایگاه داده آن را تعیین کرده است.

به‌روزرسانی مدل‌ها

sender.name = "Real Name"
sender.save()

اینک این خطوط شیء sender را به‌روزرسانی و برخی مقادیر را تعویض می‌کنند. فراخوانی متد ()save موجب به‌روزرسانی این ردیف در پایگاه داده خواهد شد.

بازیابی و نمایش مدل‌ها

>>> Sender.objects.all()
<QuerySet [<Sender: Real Name [me@example.com]>]>

یک فراخوانی به صورت {ModelName}.objects().all موجب بازیابی لیست کامل اشیای ذخیره شده در پایگاه داده برای این مدل می‌شود. این دستور آخر یک توضیح ساده برای هر شیء بازگشت می‌دهد. هر شیء مدل باید متد str_(self)_ را پیاده‌سازی کند تا پایتون بتواند این اطلاعات را به شیوه‌ای قابل خواندن از سوی انسان نمایش هد.

فیلتر کردن مدل‌ها

# Filter exact match 
Sender.objects.filter(id=1)
# Filter start text
Sender.objects.filter(email__startswith='me@')
# Filter date parts (year)
Message.objects.filter(timestamp__year=2018)
# Filter a related field in an foreign table
Message.objects.filter(sender__email="me@example.com") 
# Get an unique object using the primary key value
Sender.objects.get(pk=1)

با استفاده از متد objects.filter(params) می‌توانید انواع مختلفی از فیلترها را به شرح زیر اجرا کنید:

  • field=value – یک فیلتر ساده که برابری مقادیر را بررسی می‌کند.
  • field__startswith=txt – فیلتر متن‌هایی که با عبارت خاصی آغاز می‌شوند. به زیرخط‌های دوتایی __ که فیلد. فیلتر را جدا می‌کنند توجه کنید.
  • datefield__year=value – فیلتر کردن بر اساس بخشی از تاریخ (سال، ماه).

متد objects.get(params) برای بازیابی یک آیتم یکتا با استفاده از فیلتر استفاده می‌شود.

حذف کردن مدل‌ها

sender = Sender.objects.get(pk=1)
sender.delete()

استفاده از متد ()delete روی یک شیء مدل موجب حذف شدن آیتم از پایگاه داده خواهد شد.

گنجاندن مدل‌ها در ماژول ادمین

با استفاده از کامپوننت django.contrib.admin امکان ایجاد صفحه مدیریت برای مدل‌ها وجود دارد. کافی است فایل admin.py را در پوشه اپلیکیشن ویرایش کنید:

from django.contrib import admin

from .models import Sender
from .models import Message

admin.site.register(Sender)
admin.site.register(Message)

اکنون زمانی که سرور را با دستور زیر اجرا کنید:

python manage.py runserver

برخی گزینه‌های اضافی در اینترفیس مشاهده خواهید کرد:

مدل های پایگاه داده در پایتون

ارتقای مدل‌ها

در موارد زیادی لازم است که مدل‌ها را ویرایش کرده یا بازتعریف و فیلدهای جدیدی اضافه کنیم و یا روابط آن را اضافه یا ویرایش نماییم. در این حالت، باید مدل Message را ارتقا دهید تا خصوصیت‌های sender و recipient از یک رابطه با مدل Sender استفاده کنند. مدل‌های اولیه شبیه زیر هستند:

class Message(models.Model):
    sender = models.CharField(max_length=200)
    recipient = models.CharField(max_length=200)
    message = models.CharField(max_length=200)
    visible = models.IntegerField(default=1)
    timestamp = models.DateTimeField('date created')
    def __str__(self):
        return self.message

در واقع sender و recipient فیلدهای نرمال نامرتبط با مدل‌های دیگر هستند. ما این وضعیت را با ایجاد دو فیلد مرتبط در مدل sender تغییر می‌دهیم:

class Message(models.Model):
    sender = models.ForeignKey('Sender', on_delete=models.CASCADE, related_name='sender')
    recipient = models.ForeignKey('Sender', on_delete=models.CASCADE, related_name='recipient')
    message = models.CharField(max_length=200)
    visible = models.IntegerField(default=1)
    timestamp = models.DateTimeField('date created')
    def __str__(self):
        return self.message

اکنون مدل Message با مدل Sender مرتبط است.

برای به‌روزرسانی این مدل‌ها و ایجاد میگریشن‌های جدید در پروژه جدید بهتر است این سه گام را طی کنید:

  • فایل db.sqlite3 را حذف کنید.
  • میگریشن قبلی را در example/migrations/0001_initial.py حذف کنید.
  • دستور python manage.py makemigrations را مجدداً اجرا کرده و یک فایل میگریشن جدید بسازید.
  • دستور python manage.py migrate را برای اعمال میگریشن اجرا کنید.

در سطح پایگاه داده چه اتفاقاتی رخ می‌دهد؟

با اجرای دستور sqlmigrate می‌توانیم ببینیم که در سطح پایگاه داده چه اتفاق‌هایی رخ می‌دهد:

python manage.py sqlmigrate example 0001
BEGIN;
--
-- Create model Message
--
CREATE TABLE "example_message" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "message" varchar(200) NOT NULL, "visible" integer NOT NULL, "timestamp" datetime NOT NULL);
--
-- Create model Sender
--
CREATE TABLE "example_sender" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "email" varchar(200) NOT NULL, "imageUrl" varchar(250) NOT NULL);
--
-- Add field recipient to message
--
ALTER TABLE "example_message" RENAME TO "example_message__old";
CREATE TABLE "example_message" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "message" varchar(200) NOT NULL, "visible" integer NOT NULL, "timestamp" datetime NOT NULL, "recipient_id" integer NOT NULL REFERENCES "example_sender" ("id") DEFERRABLE INITIALLY DEFERRED);
INSERT INTO "example_message" ("id", "message", "visible", "timestamp", "recipient_id") SELECT "id", "message", "visible", "timestamp", NULL FROM "example_message__old";
DROP TABLE "example_message__old";
CREATE INDEX "example_message_recipient_id_f1469da5" ON "example_message" ("recipient_id");
--
-- Add field sender to message
--
ALTER TABLE "example_message" RENAME TO "example_message__old";
CREATE TABLE "example_message" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "message" varchar(200) NOT NULL, "visible" integer NOT NULL, "timestamp" datetime NOT NULL, "recipient_id" integer NOT NULL REFERENCES "example_sender" ("id") DEFERRABLE INITIALLY DEFERRED, "sender_id" integer NOT NULL REFERENCES "example_sender" ("id") DEFERRABLE INITIALLY DEFERRED);
INSERT INTO "example_message" ("id", "message", "visible", "timestamp", "recipient_id", "sender_id") SELECT "id", "message", "visible", "timestamp", "recipient_id", NULL FROM "example_message__old";
DROP TABLE "example_message__old";
CREATE INDEX "example_message_recipient_id_f1469da5" ON "example_message" ("recipient_id");
CREATE INDEX "example_message_sender_id_043c7729" ON "example_message" ("sender_id");
COMMIT;

چنان که می‌بینید حجم کد SQL بالا است. پس از ایجاد جدول‌های پایه یک توالی از دستورهای SQL وجود دارد که جدول را تغییر می‌دهند (ALTER TABLE)، روابط را اعلان کرده (REFERENCES) و اندیس‌ها را اضافه می‌کنند (CREATE INDEX).

مدیریت مدل‌ها در اینترفیس ادمین

اینک به بررسی تغییرات صورت گرفته روی Senders و Messages در اینترفیس ادمین می‌پردازیم. قبل از هر چیز باید دوباره super user را ایجاد کرده و سرور را آغاز کنیم.

  • با اجرای دستور python manage.py createsuperuser کاربر ادمین ایجاد می‌شود.
  • با اجرای دستور python manage.py runserver وب‌سرور اجرا می‌شود.
  • با مراجعه به نشانی http://localhost:8000/admin/ می‌توانید وارد حساب ادمین شوید.

اکنون برخی آیتم‌های Senders را در اینترفیس ادمین ایجاد می‌کنیم:

مدل های پایگاه داده در پایتون

سپس می‌توانید یک مدل Senders ایجاد کنید. اکنون برای sender و recipient یک سلکتور برای Sender-های موجود در اختیار داریم. متن هر عنصر از متد __str__(self) به دست می‌آید.

مدل های پایگاه داده در پایتون

استفاده از مدل‌ها در صفحه‌های وب

در این بخش می‌توانیم یک صفحه وب پیچیده‌تر با بهره‌گیری از محتوای به دست آمده از پایگاه داده ایجاد کنیم. کافی است فایل example/views.py را ویرایش کرده و یک نمای پیام سفارشی ایجاد کنیم:

from django.shortcuts import render
from django.http import HttpResponse
from example.models import Sender, Message
def index(request):
    messages = Message.objects.all()
    content = []
    for message in messages:
        content.append('<div style="border:1px solid gray">')
        content.append('<div><b>From:</b> %s </div>' % message.sender )
        content.append('<div><b>To:</b> %s </div>' % message.recipient )
        content.append('<div><b>Date:</b> %s </div>' % message.timestamp )
        content.append('<pre>%s</pre>' % message.message )
        content.append('</div>')
    return HttpResponse('<h1>Messages</h1> %s' % ('\n'.join(content) ) )

سپس با مراجعه به نشانی http://localhost:8000 نتیجه زیر به دست می‌آید:

Messages
From: Me [me@example.com]
To: Other [other@example.com]
Date: 2018–12–10 22:30:00+00:00
Hi! How are you?

سخن پایانی

در این مقاله با روش کار با مدل‌های پایگاه داده در جنگو و پایتون آشنا شدیم. همچنین برخی مثال‌ها را برای تفهیم بهتر مطلب مورد بررسی قرار دادیم. امیدواریم این مطلب به ارتقای دانش شما در این زمینه کمک کرده باشد.

اگر این مطلب برای شما مفید بوده است، آموزش‌ها و مطالب زیر نیز به شما پیشنهاد می‌شوند:

بر اساس رای ۶ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

«میثم لطفی» در رشته‌های ریاضیات کاربردی و مهندسی کامپیوتر به تحصیل پرداخته و شیفته فناوری است. وی در حال حاضر علاوه بر پیگیری علاقه‌مندی‌هایش در رشته‌های برنامه‌نویسی، کپی‌رایتینگ و محتوای چندرسانه‌ای، در زمینه نگارش مقالاتی با محوریت نرم‌افزار با مجله فرادرس همکاری دارد.

یک نظر ثبت شده در “استفاده از مدل های پایگاه داده در پایتون و جنگو | به زبان ساده

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد.

مشاهده بیشتر