To není něco, čeho byste se mohli nebo měli snažit dosáhnout pomocí anotace sady dotazů. Je to proto, že anotace jsou použitelné pouze pro agregační funkce, jako je Count
, Sum
atd.
Pokud jsem správně pochopil vaši otázku, můžete tuto informaci získat při iteraci sady dotazů:
for order in Order.objects.all():
types = order.details.values_list('product_type', flat=True)
Můžete to zefektivnit předběžným načtením souvisejícího OrderDetail
řádků pro každou objednávku:
for order in Order.objects.prefetch_related('details'):
types = order.details.values_list('product_type', flat=True)
Případně můžete načíst některé hodnoty z každé objednávky pomocí této metody:
queryset = Order.objects.values('id', 'user_id', 'details__product_type')
Mělo by to udělat jeden db dotaz. Podívejte se však na poznámky o tom, jak to funguje:https:/ /docs.djangoproject.com/en/1.9/ref/models/querysets/#values
Vaše sada dotazů bude vydávat diktáty namísto instancí modelu. A nedostanete pěkný seznam product_type
s... místo toho získáte opakované řádky jako:
[
{'id': 1, 'user_id': 1, 'product_type': 'chair'},
{'id': 1, 'user_id': 1, 'product_type': 'table'},
{'id': 2, 'user_id': 3, 'product_type': 'chair'},
...
]
...takže budete muset tyto řádky v pythonu seskupit do požadované datové struktury:
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'])