مقدمهای بر 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
keikaavousi
بعد از بسته شدن @fandoghpaas و ناراحتی همهمون از اینکه یه سرویس خوب و صادق نمیتونه از پس هزینهها بر بیاد، سرویسم رو منتقل کردم به پاس لیارا (https://liara.ir @liara_cloud) . تجربه راحت و خوب. تفاوتهایی داشت که کمی کار میخواست ولی تا الان کاملا راضی.
jadi
jadi
یه خسته نباشید باید به تصمیمliara_cloud@بگم،
بعد از چندین روز سرکله زدن با سرویس های مشابه بالاخره تصمیم گرفتم لیارا رو امتحان کنم و باور نمیشه ۱۰ دقیقه بیشتر وقت نبرد،
دمتون گرم.
Arch
EbadiDev
واسه سرویس PaaS با اختلاف لیارا بهترین رابط کاربری داره و یکی از مزیتهای سرویس دیتابیسشون اینه که خودشون به صورت دورهای بکآپ میگیرن.
...
Ali Najafi
me_ali_najafi
یکی از کارهای خوبی که جدیداً میکنم اینه که یه دیتابیس روی لیارا میسازم و به پروژه وصل میکنم اینطوری هم خونه و هم محل کار دیتابیس بروز رو دارم و راحت میتونم ادامه بدم کار روliara_cloud@
Navid
1navid
عاشقliara_cloud@شدم درسته در حد AWS نیست ولی خب تجربه خوبی واسه پروژه های داخل ایران ارائه میده، میتونم رو CD هم اجراش کنم
Amir H Shekari
vanenshi