To nie jest coś, co możesz lub powinieneś spróbować osiągnąć za pomocą adnotacji queryset. Dzieje się tak, ponieważ adnotacje są dostępne tylko dla funkcji agregacji, takich jak Count
, Sum
itp.
Jeśli dobrze zrozumiałem Twoje pytanie, możesz uzyskać te informacje podczas iteracji zestawu zapytań:
for order in Order.objects.all():
types = order.details.values_list('product_type', flat=True)
Możesz uczynić to bardziej wydajnym, pobierając z wyprzedzeniem powiązany OrderDetail
wiersze dla każdego zamówienia:
for order in Order.objects.prefetch_related('details'):
types = order.details.values_list('product_type', flat=True)
Alternatywnie możesz pobrać niektóre wartości z każdego zamówienia za pomocą tej metody:
queryset = Order.objects.values('id', 'user_id', 'details__product_type')
Powinien wykonać jedno zapytanie do bazy danych. Jednak zobacz uwagi tutaj, jak to działa:https:// /docs.djangoproject.com/en/1.9/ref/models/querysets/#values
Twój zestaw zapytań wygeneruje wpisy zamiast instancji modelu. I nie dostaniesz ładnej listy product_type
s... zamiast tego otrzymasz powtarzające się wiersze, takie jak:
[
{'id': 1, 'user_id': 1, 'product_type': 'chair'},
{'id': 1, 'user_id': 1, 'product_type': 'table'},
{'id': 2, 'user_id': 3, 'product_type': 'chair'},
...
]
...więc będziesz musiał zgrupować te wiersze w Pythonie w żądanej strukturze danych:
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'])