در جنگو، ORM (Object Relational Mapping) ابزارهایی را برای تعامل با پایگاه داده به صورت شیگرایانه فراهم میکند. به جای نوشتن کوئریهای SQL دستی، میتوانید از متدهای ارائهشده توسط ORM برای جستجو، فیلتر، مرتبسازی، بهروزرسانی و حذف دادهها استفاده کنید. این متدها به شما این امکان را میدهند که عملیات مختلف را به صورت ساده و خوانا انجام دهید.
برای بازیابی دادهها در جنگو، از متدهای مختلفی استفاده میشود که به شما این امکان را میدهند که رکوردها را بر اساس شرایط مختلف فیلتر کنید.
این متد برای بازیابی تمام رکوردهای موجود در جدول استفاده میشود.
مثال:
products = Product.objects.all()
در این مثال، تمام رکوردهای موجود در مدل Product
بازیابی میشوند.
این متد برای فیلتر کردن رکوردها بر اساس شرایط خاص استفاده میشود. filter()
میپذیرد که شما یک یا چند شرط را مشخص کنید و تمامی رکوردهایی که این شرایط را دارند بازگردانده میشود.
مثال:
products = Product.objects.filter(price__gte=1000)
در این مثال، تمامی محصولاتی که قیمت آنها بزرگتر یا مساوی 1000 است، فیلتر و بازیابی میشوند.
این متد برخلاف filter()
عمل میکند و تمامی رکوردهایی که شرایط دادهشده را نداشته باشند باز میگرداند.
مثال:
products = Product.objects.exclude(price__gte=1000)
در این مثال، تمام محصولاتی که قیمت آنها بزرگتر یا مساوی 1000 نیست، فیلتر و بازیابی میشوند.
این متد برای بازیابی یک رکورد خاص بر اساس یک یا چند شرط استفاده میشود. در صورتی که بیش از یک رکورد مطابق با شرایط مشخصشده پیدا شود، یک خطای MultipleObjectsReturned
رخ میدهد.
مثال:
product = Product.objects.get(id=1)
در این مثال، رکورد محصول با شناسه 1 بازیابی میشود.
برای مرتبسازی دادهها در جنگو، از متد order_by()
استفاده میشود. شما میتوانید دادهها را بر اساس یک یا چند فیلد مرتب کنید.
مثال:
products = Product.objects.all().order_by('price') # مرتبسازی به ترتیب صعودی
products = Product.objects.all().order_by('-price') # مرتبسازی به ترتیب نزولی
در این مثالها، ابتدا محصولات بر اساس قیمت به ترتیب صعودی یا نزولی مرتب میشوند.
شما میتوانید دادهها را بر اساس چندین فیلد به طور همزمان مرتب کنید.
مثال:
products = Product.objects.all().order_by('category', '-price')
در این مثال، ابتدا محصولات بر اساس دستهبندی مرتب میشوند و در صورت مشابه بودن دستهبندیها، قیمت به ترتیب نزولی مرتب خواهد شد.
برای شمارش تعداد رکوردهای یک مدل، میتوانید از متد count()
استفاده کنید.
مثال:
count = Product.objects.filter(price__gte=1000).count()
در این مثال، تعداد محصولاتی که قیمت آنها بزرگتر یا مساوی 1000 است شمارش میشود.
در جنگو، میتوانید از متد update()
برای بهروزرسانی دادهها استفاده کنید. این متد به شما این امکان را میدهد که یک یا چند فیلد را در یک یا چند رکورد به طور همزمان بهروزرسانی کنید.
مثال:
Product.objects.filter(id=1).update(price=2000)
در این مثال، قیمت محصول با شناسه 1 به 2000 تغییر میکند.
مثال:
Product.objects.filter(price__lt=1000).update(price=1200)
در این مثال، قیمت تمام محصولاتی که کمتر از 1000 هستند، به 1200 تغییر میکند.
برای حذف رکوردها، میتوانید از متد delete()
استفاده کنید. این متد به شما این امکان را میدهد که یک یا چند رکورد را حذف کنید.
مثال:
Product.objects.get(id=1).delete()
در این مثال، محصول با شناسه 1 حذف میشود.
مثال:
Product.objects.filter(price__lt=1000).delete()
در این مثال، تمام محصولاتی که قیمت آنها کمتر از 1000 است، حذف میشوند.
اگر فقط نیاز به دسترسی به چند فیلد خاص از یک مدل دارید، میتوانید از متد values()
یا values_list()
استفاده کنید. این متدها فقط فیلدهای خاص را انتخاب کرده و بازیابی میکنند.
مثال:
products = Product.objects.all().values('name', 'price')
در این مثال، فقط فیلدهای name
و price
برای تمامی محصولات بازیابی میشود.
مثال:
products = Product.objects.all().values_list('name', 'price')
در این مثال، فقط فیلدهای name
و price
به صورت یک لیست از مقادیر برای تمامی محصولات بازیابی میشود.
در صورتی که نیاز به انجام جستجوی پیچیده با استفاده از AND و OR داشته باشید، میتوانید از کلاس Q
استفاده کنید. این کلاس به شما این امکان را میدهد که جستجوهای پیچیدهتری ایجاد کنید.
from django.db.models import Q
products = Product.objects.filter(Q(price__gte=1000) & Q(category='electronics'))
در این مثال، محصولات با قیمت بزرگتر یا مساوی 1000 و دستهبندی "electronics" فیلتر میشوند.
اگر بخواهید مقادیر دو فیلد مختلف را با هم مقایسه کنید، میتوانید از کلاس F
استفاده کنید. این کلاس به شما این امکان را میدهد که مقادیر فیلدها را در یک کوئری مقایسه کنید.
from django.db.models import F
products = Product.objects.filter(price__gte=F('cost_price'))
در این مثال، محصولات با قیمت بزرگتر یا مساوی هزینه خود فیلتر میشوند.
در جنگو، زمانی که با روابط خارجی (ForeignKey یا OneToOne) کار میکنید، میتوانید از متدهای select_related
و prefetch_related
برای بهینهسازی کوئریها استفاده کنید.
متد select_related
برای روابط یک به یک و یک به چند استفاده میشود و تمام دادههای مرتبط را در یک کوئری واحد بازیابی میکند.
مثال:
products = Product.objects.select_related('category').all()
در این مثال، دادههای مربوط به دستهبندی هر محصول در یک کوئری به همراه محصولات بازیابی میشوند.
متد prefetch_related
برای روابط چند به چند و بسیاری به بسیاری استفاده میشود.
مثال:
books = Book.objects.prefetch_related('authors').all()
در این مثال، دادههای مربوط به نویسندگان هر کتاب در یک کوئری جداگانه بهینهسازی و بازیابی میشوند.
اینها تمامی مفاهیم و عملیات پایهای در ORM جنگو هستند که میتوانید برای تعامل با پایگاه داده استفاده کنید. امیدوارم این توضیحات برای شما مفید بوده باشد.