2016-08-04 1 views
0

У меня есть следующий менеджер:Django - Как получить отображаемое имя внутри QuerySet .values ​​()

class Totals(Manager): 

def by_customer_and_date(self, start_date, end_date): 

    qs = self.model.objects.filter(
     date__range=(start_date, end_date) 
    ).values(
     "customer" 
    ).annotate(
     ...bunch of stuff... 
    ) 

    return qs 

Где customer является FK отношение к другому объекту. Прямо сейчас, пакеты запросов размещаются в связанных объектах customer, но я бы хотел, чтобы они использовали отображаемые имена, чтобы я мог хорошо упаковать его для моего шаблона.

В настоящем время, я добавил следующее в сену:

for q in qs: 
    q['customer'] = Customer.objects.get(id=q.get('customer')).name 

Он отлично работает, но он чувствует, как дополнительную работа .. для меня это 50 базы данных попадет в отличие от одного. Есть ли ярлыки для размещения отображаемого имени в словаре qs сразу с места в карьер?

ответ

2

Вы можете перейти к связанным объектам с помощью __.

qs = self.model.objects.filter(
    date__range=(start_date, end_date) 
).values(
    "customer__name" 
) 
+0

Право на. Я люблю Django. Теперь я могу взять его в свой шаблон с помощью '{{item.customer__name}}' –

1

Вы также можете использовать __ в ваши ценности, как этот .values("customer__name") для выбора поля на соответствующей таблице.

0

Используйте этот код для получения всех связанных имен клиентов.

class Totals(Manager): 

def by_customer_and_date(self, start_date, end_date): 

    name_list = self.model.objects.filter(
     date__range=(start_date, end_date) 
    ).values("customer__name", flat=True) 

    return name_list