これは、クエリセットアノテーションを使用して実現できる、または実現しようとするべきものではありません。これは、アノテーションが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
クエリセットは、モデルインスタンスの代わりにdictを出力します。また、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'])