مقدمهای بر ORM در فریمورک Django
۲۴ دی ۱۳۹۹

در برنامههای Django این امکان وجود دارد تا با Modelهای دیتابیس خود تعامل داشته باشیم و دادهها را با یک abstraction API بهنام ORM (Object Relational Mappe) به دیتابیس اضافه، حذف یا اصلاح کنیم. بههمین منظور تصمیم گرفتیم تا در این مقاله بهصورت مقدماتی به ORM در فریمورک Django بپردازیم.
کدهای Model برنامهی ما بهصورت زیر است:
class Album(models.Model):
title = models.CharField(max_length = 30)
artist = models.CharField(max_length = 30)
genre = models.CharField(max_length = 30)
def __str__(self):
return self.title
class Song(models.Model):
name = models.CharField(max_length = 100)
album = models.ForeignKey(Album, on_delete = models.CASCADE)
def __str__(self):
return self.name
و ما با اجرای دستور زیر در مسیر پروژه میتوانیم به Django ORM دسترسی پیدا کنیم:
python manage.py shell
با اجرای دستور بالا به یک کنسول interactive دسترسی پیدا خواهیم کرد و با فرض اینکه Modelهای ما در myProject/albums/models.py
قرار گرفته باشند، این مقاله را ادامه میدهیم.
>>> from books.models import Song, Album
اضافه کردن objectها
برای ایجاد سه object از Albumهای مختلف و ذخیره آنها در دیتابیس میتوانیم دستورهای زیر را بهترتیب اجرا کنیم:
>>> a = Album(title = "Divide", artist = "Ed Sheeran", genre = "Pop")
>>> a.save()
>>> a = Album(title = "Abbey Road", artist = "The Beatles", genre = "Rock")
>>> a.save()
>>> a = Album(title = "Revolver", artist = "The Beatles", genre = "Rock")
>>> a.save()
و به همین ترتیب برای ایجاد یک object از Song و ذخیره آن در دیتابیس بهصورت زیر عمل خواهیم کرد:
>>> s = Song(name = "Castle on the Hill", album = a)
>>> s.save()
فراخوانی objectها
فراخوانی تمام objectهای یک Model با دستور زیر انجام میشود:
>>> Album.objects.all()
<QuerySet [<Album: Divide>, <Album: Abbey Road>, <Album: Revolver>]>
همانطور که مشاهده میکنید، خروجی بهصورت QuerySet یا مجموعهای از objectها است که با query ما مطابقت پیدا کرده است. توجه داشته باشید که نامهای چاپ شده در کنسول، خروجی فانکشن __str__()
بودهاند. همچنین ما میتوانیم با استفاده از فانکشنهای filter()
، exclude()
و get()
موارد دلخواه خودمان را فیلتر کنیم. فانکشن filter()
یک QuerySet به ما برمیگرداند که محتوای آن objectهایی است که با query ما مطابقت داده شدهاند.
>>> Album.objects.filter(artist = "The Beatles")
<QuerySet [<Album: Abbey Road>, <Album: Revolver>]>
فانکشن exclude()
نیز یک QuerySet را برمیگرداند که محتوای آن objectهایی خلاف query ما هستند.
>>> Album.objects.exclude(genre = "Rock")
<QuerySet [<Album: Divide>] >
ودر آخر فانکشن get()
فقط یک object که با query مطابقت داشته است را برمیگرداند و توجه داشته باشید که query شما محدود به یک object باشد زیرا اگر چندین object برگردانده شود، خطا رخ میدهد.
>>> Album.objects.get(pk = 3)
<QuerySet [<Album: Revolver>]>
بهروزرسانی objectهای از پیش تعریف شده
ما میتوانیم بهصورت زیر یک object را بهروزرسانی کنیم:
>>> a = Album.objects.get(pk = 3)
>>> a.genre = "Pop"
>>> a.save()
حذف objectها
برای حذف یک object میتوانیم از دستورهای زیر استفاده کنیم:
>>> a = Album.objects.get(pk = 2)
>>> a.delete()
>>> Album.objects.all()
<QuerySet [<Album: Divide>, <Album: Revolver>]>
و برای حذف چندین object نیز میتوانیم از فانکشنهای filter()
و یا exclude()
استفاده کنیم:
>>> Album.objects.filter(genre = "Pop").delete()
>>> Album.objects.all()
<QuerySet []>
منبع: https://www.geeksforgeeks.org/django-orm-inserting-updating-deleting-data
توسعهدهندگان دربارهی ما چه میگویند
تجربه کار باliara_cloud@امروز خیلی خوب بود. یکی از سرویس هام رو منتقل کردم روش و راضیم. انقد سریع و جذاب کارم راه افتادم اصن باورم نمیشد! برعکس سرویس های PaaS دیگه با اون همه پیچیدگیشون. دمتون گرم
...
MohammadReza
![liara testimonial]()
keikaavousi
بعد از بسته شدن @fandoghpaas و ناراحتی همهمون از اینکه یه سرویس خوب و صادق نمیتونه از پس هزینهها بر بیاد، سرویسم رو منتقل کردم به پاس لیارا (https://liara.ir @liara_cloud) . تجربه راحت و خوب. تفاوتهایی داشت که کمی کار میخواست ولی تا الان کاملا راضی.
jadi
![liara testimonial]()
jadi
با قدرت میتونم بگم تیم پشتیانی لیاراliara_cloud@یکی از بهترین تیمهای پشتیبانی که تا حالا دیدم. کارشون ارائه سرویسهای PaaS هست ولی من سوال در سطح برنامه خودمم(نه زیرساخت پلتفرم) که میپرسم بازم کامل و به موقع راهنمایی میکنن.
Amir
![liara testimonial]()
amirmazinani_ir
واسه سرویس PaaS با اختلاف لیارا بهترین رابط کاربری داره و یکی از مزیتهای سرویس دیتابیسشون اینه که خودشون به صورت دورهای بکآپ میگیرن.
...
Ali Najafi
![liara testimonial]()
me_ali_najafi
یکی از کارهای خوبی که جدیداً میکنم اینه که یه دیتابیس روی لیارا میسازم و به پروژه وصل میکنم اینطوری هم خونه و هم محل کار دیتابیس بروز رو دارم و راحت میتونم ادامه بدم کار روliara_cloud@
Navid
![liara testimonial]()
1navid
عاشقliara_cloud@شدم درسته در حد AWS نیست ولی خب تجربه خوبی واسه پروژه های داخل ایران ارائه میده، میتونم رو CD هم اجراش کنم
Amir H Shekari
![liara testimonial]()
vanenshi