مقدمهای بر 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