تجربه ای از کار با Models API
سلام
در دستور زیر از شل پایتون استفاده شده است که با آن کاری نداریم اما برای اینکه این شل را با پروژۀ خودمان بالا بیاوریم لازم است دستور زیر را در cmd اجرا می کنیم.
python manage.py shell
خروجی:
Python 3.6.2 (v3.6.2:5fd33b5, Jul ۸ ۲۰۱۷, ۰۴:۵۷:۳۶) [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 را تنظیم نکردهایم؛ جنگو به صورت پیش فرض آن را ۱ تنظیم و به صورت خودکار اضافه می کند.
board.id ۱
دسترسی به سایر فیلدها هم به آسانی امکان پذیر است.
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 ۲ 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 باید با دقت باشد و مثلاً اگر آیدی را ۳ وارد کنیم خطا می دهد.
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.
- خلاصۀ این توابع:
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
دیدگاه خود را ثبت کنید
تمایل دارید در گفتگو شرکت کنید؟نظری بدهید!