استفاده از مدل های پایگاه داده در پایتون و جنگو | به زبان ساده
در این مقاله در خصوص استفاده از مدل های پایگاه داده در پایتون و جنگو توضیحاتی ارائه میکنیم. مراحل کار به شرح زیر هستند:
- ایجاد مدلهای جدید برای پردازش دادهها.
- افزودن مدلها به اینترفیس ادمین.
- ایجاد، ویرایش فیلتر و حذف اطلاعات در مدلها.
- ارتقای مدلها با خصوصیتها و متدها.
- یکپارچهسازی دادهها در اپلیکیشن.
ایجاد مدل پایگاه داده
در جنگو امکان ساخت مدلهای پایگاه داده با استفاده از کد پایتون وجود دارد.
به این منظور باید فایل models.py را درون پوشه اپلیکیشن (example/models.py) ایجاد کنید:
1from django.db import models
2
3# Create your models here.
4
5class Sender(models.Model):
6 name = models.CharField(max_length=200)
7 email = models.CharField(max_length=200)
8 imageUrl = models.CharField(max_length=250)
9 def __str__(self):
10 return self.name
11
12class Message(models.Model):
13 sender = models.CharField(max_length=200)
14 recipient = models.CharField(max_length=200)
15 message = models.CharField(max_length=200)
16 visible = models.IntegerField(default=1)
17 timestamp = models.DateTimeField('date created')
18 def __str__(self):
19 return self.message
این کد موجب ایجاد 2 جدول به نامهای senders و messages میشود. در هر یک از این جدولها میتوان فیلدهایی را با استفاده از متدهای شیء models تعریف کرد.
- متد ()CharField برای فیلدهای متنی با یک «طول بیشینه» (max_length) تعریف شده.
- متد ()IntegerField برای مقادیر صحیح با یک مقدار default.
- متد ()DateTimeField برای ذخیرهسازی تاریخ/زمان.
متد str__(self)__ برای دریافت یک بازنمایی string از شیء استفاده میشود. در هر حالت میتوانید از فیلد یا ترکیبی از مقادیر استفاده کنید.
ایجاد و اجرای میگریشنها
اینک میتوانید جدولهای تعریف شده در فایل models.py را با ایجاد یک فایل migration ایجاد کنید. این فایل برای اجرای فرایند ایجاد هر جدول مورد استفاده قرار میگیرد.
python manage.py makemigrations
1Migrations for 'example':
2example/migrations/0001_initial.py
3- Create model Message
4- Create model Sender
به این ترتیب یک فایل جدید به نام example/migrations/0001_initial.py ایجاد میشود که شامل دستورهایی برای ایجاد جداول است. گام بعدی اجرای میگریشن است:
python manage.py migrate
1Operations to perform:
2 Apply all migrations: admin, auth, contenttypes, example, sessions
3Running migrations:
4 Applying example.0001_initial... OK
سپس جدولهای جدید در پایگاه داده SQLite ایجاد میشوند. اگر علاقهمند هستید ببینید کد میگریشن در SQL ساده به چه شکل است، میتوانید از دستور sqlmigrate زیر استفاده کنید:
python manage.py sqlmigrate example 0001
این دستور یک فهرست از دستورهای SQL نمایش میدهد:
1BEGIN;
2--
3-- Create model Message
4--
5CREATE 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);
6--
7-- Create model Sender
8--
9CREATE 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);
10COMMIT;
توجه کنید که خروجی فوق ممکن است بسته به نسخههای مختلف پایگاه داده SQLite متفاوت باشد.
استفاده از عملیات پایگاه داده جنگو
به جای اجرای دستورهای خاص و پیچیده SQL میتوان با تابعهای پایگاه داده ارائه شده از سوی جنگو و پایتون کار کرد. به این ترتیب میتوانید یک کنسول خاص پایتون آغاز کنید که آماده کار با اپلیکیشن و مدلها است:
python manage.py shell
اکنون کنسولی دارید که دستورهای پایتون را اجرا میکند. برخی دستورهای مفید که میتوان اجرا کرد به صورت زیر هستند:
from example.models import Sender, Message from django.utils import timezone
خط اول اشیای Sender و Message مرتبط با جدولهای ایجاد شده در میگریشن را ایمپورت میکند. خط دوم شیء timezone را برای کار با عملیات تاریخ/زمان ایمپورت میکند.
ایجاد مدلها
1sender = Sender(email="me@example.com", name="Me Myself", imageUrl = "http://my/image.png")
2sender.save()
3sender.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)_ را پیادهسازی کند تا پایتون بتواند این اطلاعات را به شیوهای قابل خواندن از سوی انسان نمایش هد.
فیلتر کردن مدلها
1# Filter exact match
2Sender.objects.filter(id=1)
3# Filter start text
4Sender.objects.filter(email__startswith='me@')
5# Filter date parts (year)
6Message.objects.filter(timestamp__year=2018)
7# Filter a related field in an foreign table
8Message.objects.filter(sender__email="me@example.com")
9# Get an unique object using the primary key value
10Sender.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 را در پوشه اپلیکیشن ویرایش کنید:
1from django.contrib import admin
2
3from .models import Sender
4from .models import Message
5
6admin.site.register(Sender)
7admin.site.register(Message)
اکنون زمانی که سرور را با دستور زیر اجرا کنید:
python manage.py runserver
برخی گزینههای اضافی در اینترفیس مشاهده خواهید کرد:
ارتقای مدلها
در موارد زیادی لازم است که مدلها را ویرایش کرده یا بازتعریف و فیلدهای جدیدی اضافه کنیم و یا روابط آن را اضافه یا ویرایش نماییم. در این حالت، باید مدل Message را ارتقا دهید تا خصوصیتهای sender و recipient از یک رابطه با مدل Sender استفاده کنند. مدلهای اولیه شبیه زیر هستند:
1class Message(models.Model):
2 sender = models.CharField(max_length=200)
3 recipient = models.CharField(max_length=200)
4 message = models.CharField(max_length=200)
5 visible = models.IntegerField(default=1)
6 timestamp = models.DateTimeField('date created')
7 def __str__(self):
8 return self.message
در واقع sender و recipient فیلدهای نرمال نامرتبط با مدلهای دیگر هستند. ما این وضعیت را با ایجاد دو فیلد مرتبط در مدل sender تغییر میدهیم:
1class Message(models.Model):
2 sender = models.ForeignKey('Sender', on_delete=models.CASCADE, related_name='sender')
3 recipient = models.ForeignKey('Sender', on_delete=models.CASCADE, related_name='recipient')
4 message = models.CharField(max_length=200)
5 visible = models.IntegerField(default=1)
6 timestamp = models.DateTimeField('date created')
7 def __str__(self):
8 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
1BEGIN;
2--
3-- Create model Message
4--
5CREATE TABLE "example_message" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "message" varchar(200) NOT NULL, "visible" integer NOT NULL, "timestamp" datetime NOT NULL);
6--
7-- Create model Sender
8--
9CREATE 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);
10--
11-- Add field recipient to message
12--
13ALTER TABLE "example_message" RENAME TO "example_message__old";
14CREATE 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);
15INSERT INTO "example_message" ("id", "message", "visible", "timestamp", "recipient_id") SELECT "id", "message", "visible", "timestamp", NULL FROM "example_message__old";
16DROP TABLE "example_message__old";
17CREATE INDEX "example_message_recipient_id_f1469da5" ON "example_message" ("recipient_id");
18--
19-- Add field sender to message
20--
21ALTER TABLE "example_message" RENAME TO "example_message__old";
22CREATE 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);
23INSERT INTO "example_message" ("id", "message", "visible", "timestamp", "recipient_id", "sender_id") SELECT "id", "message", "visible", "timestamp", "recipient_id", NULL FROM "example_message__old";
24DROP TABLE "example_message__old";
25CREATE INDEX "example_message_recipient_id_f1469da5" ON "example_message" ("recipient_id");
26CREATE INDEX "example_message_sender_id_043c7729" ON "example_message" ("sender_id");
27COMMIT;
چنان که میبینید حجم کد 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 را ویرایش کرده و یک نمای پیام سفارشی ایجاد کنیم:
1from django.shortcuts import render
2from django.http import HttpResponse
3from example.models import Sender, Message
4def index(request):
5 messages = Message.objects.all()
6 content = []
7 for message in messages:
8 content.append('<div style="border:1px solid gray">')
9 content.append('<div><b>From:</b> %s </div>' % message.sender )
10 content.append('<div><b>To:</b> %s </div>' % message.recipient )
11 content.append('<div><b>Date:</b> %s </div>' % message.timestamp )
12 content.append('<pre>%s</pre>' % message.message )
13 content.append('</div>')
14 return HttpResponse('<h1>Messages</h1> %s' % ('\n'.join(content) ) )
سپس با مراجعه به نشانی http://localhost:8000 نتیجه زیر به دست میآید:
1Messages
2From: Me [me@example.com]
3To: Other [other@example.com]
4Date: 2018–12–10 22:30:00+00:00
5Hi! How are you?
سخن پایانی
در این مقاله با روش کار با مدلهای پایگاه داده در جنگو و پایتون آشنا شدیم. همچنین برخی مثالها را برای تفهیم بهتر مطلب مورد بررسی قرار دادیم. امیدواریم این مطلب به ارتقای دانش شما در این زمینه کمک کرده باشد.
سلام. ما اگع فایل db.sqlite3 را حدف کنیم کلع دیتا هامون حذف میشن راهع دیگع ایی نیست؟