这不是您可以或应该尝试通过查询集注释来实现的目标。这是因为注释仅可用于聚合函数,例如Count
, Sum
etc.
如果我正确理解您的问题,您可以在迭代查询集时获取此信息:
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')
它应该执行单个数据库查询。但是,请参阅此处有关其工作原理的注释:https://docs.djangoproject.com/en/1.9/ref/models/querysets/#values https://docs.djangoproject.com/en/1.9/ref/models/querysets/#values
您的查询集将输出字典而不是模型实例。你不会得到一份不错的清单product_type
相反,您会得到重复的行,例如:
[
{'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'])