Това не е нещо, което можете или трябва да се опитате да постигнете с анотация на набор от заявки. Това е така, защото поясненията могат да се използват само за функции за агрегиране като Count
, Sum
и др.
Ако разбрах въпроса ви правилно, можете да получите тази информация, когато преглеждате набора от заявки:
for order in Order.objects.all():
types = order.details.values_list('product_type', flat=True)
Можете да направите това по-ефективно, като предварително извлечете свързания OrderDetail
редове за всяка поръчка:
for order in Order.objects.prefetch_related('details'):
types = order.details.values_list('product_type', flat=True)
Като алтернатива можете да извлечете някои стойности от всяка поръчка, като използвате този метод:
queryset = Order.objects.values('id', 'user_id', 'details__product_type')
Трябва да направи една заявка за db. Все пак вижте бележките тук за това как работи това:https:/ /docs.djangoproject.com/en/1.9/ref/models/querysets/#values
Вашият набор от заявки ще изведе dicts вместо екземпляри на модела. И няма да получите приятен списък с product_type
s... вместо това ще получите повтарящи се редове като:
[
{'id': 1, 'user_id': 1, 'product_type': 'chair'},
{'id': 1, 'user_id': 1, 'product_type': 'table'},
{'id': 2, 'user_id': 3, 'product_type': 'chair'},
...
]
...така че след това ще трябва да групирате тези редове в python в структурата от данни, която искате:
from collections import OrderedDict
grouped = OrderedDict()
for order in Order.objects.values('id', 'user_id', 'details__product_type'):
if order['id'] not in grouped:
grouped[order['id']] = {
'id': order['id'],
'user_id': order['user_id'],
'types': set(),
}
grouped[order['id']]['types'].add(order['details__product_type'])