Skip to content

Latest commit

 

History

History
245 lines (141 loc) · 9.6 KB

4-Basic-Queries-and-Operations-in-Django-ORM.md

File metadata and controls

245 lines (141 loc) · 9.6 KB

4. کوئری‌ها و عملیات پایه‌ای در ORM جنگو

در جنگو، ORM (Object Relational Mapping) ابزارهایی را برای تعامل با پایگاه داده به صورت شی‌گرایانه فراهم می‌کند. به جای نوشتن کوئری‌های SQL دستی، می‌توانید از متدهای ارائه‌شده توسط ORM برای جستجو، فیلتر، مرتب‌سازی، به‌روزرسانی و حذف داده‌ها استفاده کنید. این متدها به شما این امکان را می‌دهند که عملیات مختلف را به صورت ساده و خوانا انجام دهید.

4.1. جستجو و بازیابی داده‌ها

برای بازیابی داده‌ها در جنگو، از متدهای مختلفی استفاده می‌شود که به شما این امکان را می‌دهند که رکوردها را بر اساس شرایط مختلف فیلتر کنید.

4.1.1. متد all()

این متد برای بازیابی تمام رکوردهای موجود در جدول استفاده می‌شود.

مثال:

products = Product.objects.all()

در این مثال، تمام رکوردهای موجود در مدل Product بازیابی می‌شوند.

4.1.2. متد filter()

این متد برای فیلتر کردن رکوردها بر اساس شرایط خاص استفاده می‌شود. filter() می‌پذیرد که شما یک یا چند شرط را مشخص کنید و تمامی رکوردهایی که این شرایط را دارند بازگردانده می‌شود.

مثال:

products = Product.objects.filter(price__gte=1000)

در این مثال، تمامی محصولاتی که قیمت آن‌ها بزرگتر یا مساوی 1000 است، فیلتر و بازیابی می‌شوند.

4.1.3. متد exclude()

این متد برخلاف filter() عمل می‌کند و تمامی رکوردهایی که شرایط داده‌شده را نداشته باشند باز می‌گرداند.

مثال:

products = Product.objects.exclude(price__gte=1000)

در این مثال، تمام محصولاتی که قیمت آن‌ها بزرگتر یا مساوی 1000 نیست، فیلتر و بازیابی می‌شوند.

4.1.4. متد get()

این متد برای بازیابی یک رکورد خاص بر اساس یک یا چند شرط استفاده می‌شود. در صورتی که بیش از یک رکورد مطابق با شرایط مشخص‌شده پیدا شود، یک خطای MultipleObjectsReturned رخ می‌دهد.

مثال:

product = Product.objects.get(id=1)

در این مثال، رکورد محصول با شناسه 1 بازیابی می‌شود.


4.2. مرتب‌سازی داده‌ها

برای مرتب‌سازی داده‌ها در جنگو، از متد order_by() استفاده می‌شود. شما می‌توانید داده‌ها را بر اساس یک یا چند فیلد مرتب کنید.

4.2.1. مرتب‌سازی صعودی و نزولی

مثال:

products = Product.objects.all().order_by('price')  # مرتب‌سازی به ترتیب صعودی
products = Product.objects.all().order_by('-price')  # مرتب‌سازی به ترتیب نزولی

در این مثال‌ها، ابتدا محصولات بر اساس قیمت به ترتیب صعودی یا نزولی مرتب می‌شوند.

4.2.2. مرتب‌سازی چندگانه

شما می‌توانید داده‌ها را بر اساس چندین فیلد به طور همزمان مرتب کنید.

مثال:

products = Product.objects.all().order_by('category', '-price')

در این مثال، ابتدا محصولات بر اساس دسته‌بندی مرتب می‌شوند و در صورت مشابه بودن دسته‌بندی‌ها، قیمت به ترتیب نزولی مرتب خواهد شد.


4.3. تعداد رکوردها

برای شمارش تعداد رکوردهای یک مدل، می‌توانید از متد count() استفاده کنید.

مثال:

count = Product.objects.filter(price__gte=1000).count()

در این مثال، تعداد محصولاتی که قیمت آن‌ها بزرگتر یا مساوی 1000 است شمارش می‌شود.


4.4. عملیات به‌روزرسانی

در جنگو، می‌توانید از متد update() برای به‌روزرسانی داده‌ها استفاده کنید. این متد به شما این امکان را می‌دهد که یک یا چند فیلد را در یک یا چند رکورد به طور همزمان به‌روزرسانی کنید.

4.4.1. به‌روزرسانی یک رکورد خاص

مثال:

Product.objects.filter(id=1).update(price=2000)

در این مثال، قیمت محصول با شناسه 1 به 2000 تغییر می‌کند.

4.4.2. به‌روزرسانی چند رکورد

مثال:

Product.objects.filter(price__lt=1000).update(price=1200)

در این مثال، قیمت تمام محصولاتی که کمتر از 1000 هستند، به 1200 تغییر می‌کند.


4.5. حذف داده‌ها

برای حذف رکوردها، می‌توانید از متد delete() استفاده کنید. این متد به شما این امکان را می‌دهد که یک یا چند رکورد را حذف کنید.

4.5.1. حذف یک رکورد خاص

مثال:

Product.objects.get(id=1).delete()

در این مثال، محصول با شناسه 1 حذف می‌شود.

4.5.2. حذف چند رکورد

مثال:

Product.objects.filter(price__lt=1000).delete()

در این مثال، تمام محصولاتی که قیمت آن‌ها کمتر از 1000 است، حذف می‌شوند.


4.6. انتخاب فیلدهای خاص

اگر فقط نیاز به دسترسی به چند فیلد خاص از یک مدل دارید، می‌توانید از متد values() یا values_list() استفاده کنید. این متدها فقط فیلدهای خاص را انتخاب کرده و بازیابی می‌کنند.

4.6.1. استفاده از values()

مثال:

products = Product.objects.all().values('name', 'price')

در این مثال، فقط فیلدهای name و price برای تمامی محصولات بازیابی می‌شود.

4.6.2. استفاده از values_list()

مثال:

products = Product.objects.all().values_list('name', 'price')

در این مثال، فقط فیلدهای name و price به صورت یک لیست از مقادیر برای تمامی محصولات بازیابی می‌شود.


4.7. استفاده از Q برای جستجوی پیچیده

در صورتی که نیاز به انجام جستجوی پیچیده با استفاده از AND و OR داشته باشید، می‌توانید از کلاس Q استفاده کنید. این کلاس به شما این امکان را می‌دهد که جستجوهای پیچیده‌تری ایجاد کنید.

مثال:

from django.db.models import Q

products = Product.objects.filter(Q(price__gte=1000) & Q(category='electronics'))

در این مثال، محصولات با قیمت بزرگتر یا مساوی 1000 و دسته‌بندی "electronics" فیلتر می‌شوند.


4.8. استفاده از F برای مقایسه فیلدها

اگر بخواهید مقادیر دو فیلد مختلف را با هم مقایسه کنید، می‌توانید از کلاس F استفاده کنید. این کلاس به شما این امکان را می‌دهد که مقادیر فیلدها را در یک کوئری مقایسه کنید.

مثال:

from django.db.models import F

products = Product.objects.filter(price__gte=F('cost_price'))

در این مثال، محصولات با قیمت بزرگتر یا مساوی هزینه خود فیلتر می‌شوند.


4.9. استفاده از select_related و prefetch_related

در جنگو، زمانی که با روابط خارجی (ForeignKey یا OneToOne) کار می‌کنید، می‌توانید از متدهای select_related و prefetch_related برای بهینه‌سازی کوئری‌ها استفاده کنید.

4.9.1. استفاده از select_related

متد select_related برای روابط یک به یک و یک به چند استفاده می‌شود و تمام داده‌های مرتبط را در یک کوئری واحد بازیابی می‌کند.

مثال:

products = Product.objects.select_related('category').all()

در این مثال، داده‌های مربوط به دسته‌بندی هر محصول در یک کوئری به همراه محصولات بازیابی می‌شوند.

4.9.2. استفاده از prefetch_related

متد prefetch_related برای روابط چند به چند و بسیاری به بسیاری استفاده می‌شود.

مثال:

books = Book.objects.prefetch_related('authors').all()

در این مثال، داده‌های مربوط به نویسندگان هر کتاب در یک کوئری جداگانه بهینه‌سازی و بازیابی می‌شوند.


این‌ها تمامی مفاهیم و عملیات پایه‌ای در ORM جنگو هستند که می‌توانید برای تعامل با پایگاه داده استفاده کنید. امیدوارم این توضیحات برای شما مفید بوده باشد.