تجربه ای از کار با Models API

جنگو

سلام

در دستور زیر از شل پایتون استفاده شده است که با آن کاری نداریم اما برای اینکه این شل را با پروژۀ خودمان بالا بیاوریم لازم است دستور زیر را در cmd اجرا می کنیم.

python manage.py shell

خروجی:

Python 3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

(InteractiveConsole)

>>>

این حالت مشابه وقتی است که صرفاً دستور python را اجرا می کنیم اما این دستور، پروژۀ ما را به sys.path  اضافه و سپس جنگو را لود می کند. یعنی می توانیم به راحتی مدل‌ها و سایر فایل‌های مربوط به پروژه را درون آن import کنیم.

در ابتدا کلاس بورد را اضافه می کنیم.

from boards.models import Board

یک شی جدید از آن ایجاد می کنیم.

board = Board(name='Django', description='This is a board about Django.')

برای اینکه این شی را درون دیتابیس ذخیره کنیم؛ دستور زیر را وارد می کنیم:

board.save()

از دستور save هم برای ذخیره و هم برای بروزرسانی استفاده می شود.

با توجه به اینکه در این دستور مقدار id را تنظیم نکرده‌ایم؛ جنگو به صورت پیش فرض آن را 1 تنظیم و به صورت خودکار اضافه می کند.

board.id
1

دسترسی به سایر فیلدها هم به آسانی امکان پذیر است.

board.name
'Django'

board.description
'This is a board about Django.'

برای بروز رسانی هم به راحتی با دستور زیر اینکار را می کنیم.

board.description = 'Django discussion board.'
board.save()

هر کدام از مدل‌ها در جنگو با attribute خاصی همراه است که به آن Model Manager می گوییم. دسترسی به آن با تابع objects فراهم می شود و می توان به صورت مستقیم شی‌ای را ایجاد و مقدار دهی کرد:

board = Board.objects.create(name='Python', description='General discussion about Python.')
board.id
2

board.name
'Python'

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

Board.objects.all()
<QuerySet [<Board: Board object>, <Board: Board object>]>

که البته نتیجه به صورت یک QuerySet نمایش داده می شود و خیلی مفهوم نیست و علتش هم این است که تابع __str__ را در مدل خود تعریف نکرده ایم.

با دستور ()exit از شل پایتون خارج شده و در اپِ بورد فایل models.py را ویرایش و این تابع را به کلاس بورد اضافه می کنیم.

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

    def __str__(self):
        return self.name

دوباره همان کوئری قبلی را در CMD اجرا می کنیم.

python manage.py shell

و کدهای زیر را در محیط شل پایتون می زنیم.

from boards.models import Board

Board.objects.all()
<QuerySet [<Board: Django>, <Board: Python>]>

همانطور که معلوم است بهتر شد. برای بررسی تمام داده‌ها از مفهوم لیست استفاده می کنیم:

boards_list = Board.objects.all()
for board in boards_list:
print(board.description)

و خروجی به شکل زیر می شود:

Django discussion board.
General discussion about Python.

یکی از تابع‌های پرکاربرد دیگر get است:

django_board = Board.objects.get(id=1)
django_board.name
'Django'

استفاده از تابع get باید با دقت باشد و مثلاً اگر آیدی را 3 وارد کنیم خطا می دهد.

board = Board.objects.get(id=3)
boards.models.DoesNotExist: Board matching query does not exist.

البته این تابع را می توان در خصوص سایر فیلدها هم به کار برد.

Board.objects.get(name='Django')
<Board: Django>

* نکتۀ بسیار مهم این که این تابع به بزرگ و کوچک حروف حساس است:

Board.objects.get(name='django')
boards.models.DoesNotExist: Board matching query does not exist.
  1. خلاصۀ این توابع:
Operation Code sample
ساخت یک شی بدون ذخیره سازی

board = Board()

ذخیره یا بروز رسانی شی

board.save()

ساخت و ذخیره شی در دیتابیس

Board.objects.create(name=’…’, description=’…’)

لیست اشیاء مختلف

Board.objects.all()

دریافت یک شیء و بر اساس فیلد

Board.objects.get(id=1)

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

 

مطلب بعدی: Views, Templates و Static Files

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

بدون دیدگاه

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

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

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

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

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

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

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

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

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