Применение метода класса к набору запросов в Django

#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