#django
#django
Вопрос:
Я новичок в продвинутых концепциях Django, и я немного смущен применением таких концепций, как пользовательские методы.
В принципе, моя цель лучше всего описывается этим коротким примером. У меня есть два класса, а именно vendor и order. У каждого заказа есть поставщик. Модели выглядят следующим образом:
class Order(models.Model):
vendor_agreement = models.ForeignKey(VendorAgreement, on_delete = models.CASCADE)
@property
def get_vendor_agreement(self):
....
return result
Как вы видите, у меня есть вся бизнес-логика между order
и vendor_agreement
, инкапсулированная в get_vendor_agreement
метод.
Вопрос: Есть ли какой-нибудь элегантный способ получить список distinct vendor_agreements
, соответствующий order
набору запросов? Я имею в виду, что-то вроде Order.objects.filter(...).vendor_agreement()
, который вернул бы список различных соглашений с поставщиками. Заранее благодарю вас.
Ответ №1:
Из официальной документации:
from django.db import models
class Reporter(models.Model):
# ...
pass
class Article(models.Model):
reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
В приведенном выше примере приведенные ниже методы будут доступны в диспетчере reporter.article_set.
Кроме того, вы можете использовать метод prefetch_related, который объединит ваши данные в одном запросе.
В вашем случае код должен выглядеть так:
order_list = Order.objects.filter(...).prefetch_related('vendor_agreement')
for order in order_list:
print order
for vendor_agreement in order.vendor_agreement_set.all():
print vendor_agreement
Код из моего примера попадет в базу данных только один раз.
Комментарии:
1. prefetch_related, а не select_related… Но в любом случае — прочитайте этот документ: docs.djangoproject.com/en/1.10/ref/models/querysets