2016-10-10 4 views
0

Я новичок в продвинутых концепциях Django, и я немного запутался в применении таких понятий, как пользовательские методы.Применение метода класса к запросу в Django

В принципе, моя цель лучше описана в этом кратком примере. У меня есть два класса, а именно продавец и заказ. В каждом заказе есть поставщик. Модели выглядят следующим образом:

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.

Вопрос Есть ли элегантный способ, чтобы получить список отчетливого vendor_agreements, которые соответствуют order QuerySet? Я имею в виду, что-то вроде Order.objects.filter(...).vendor_agreement(), которое вернет список различных соглашений о поставщиках. Спасибо заранее.

ответ

2

От официального documentation:

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 

код из моего примера ударится базу данных только один раз.

+0

prefetch_related, not select_related ... Но в любом случае - прочитайте этот документ: https://docs.djangoproject.com/en/1.10/ref/models/querysets/ –