Ini bukan sesuatu yang dapat atau harus Anda coba capai dengan anotasi queryset. Ini karena anotasi hanya dapat digunakan untuk fungsi agregasi seperti Count
, Sum
dll.
Jika saya memahami pertanyaan Anda dengan benar, Anda bisa mendapatkan info ini saat mengulangi set kueri:
for order in Order.objects.all():
types = order.details.values_list('product_type', flat=True)
Anda dapat membuatnya lebih efisien dengan mengambil OrderDetail
terkait sebelumnya baris untuk setiap pesanan:
for order in Order.objects.prefetch_related('details'):
types = order.details.values_list('product_type', flat=True)
Atau, Anda dapat mengambil beberapa nilai dari setiap pesanan menggunakan metode ini:
queryset = Order.objects.values('id', 'user_id', 'details__product_type')
Itu harus melakukan permintaan db tunggal. Namun, lihat catatan di sini tentang cara kerjanya:https:// /docs.djangoproject.com/en/1.9/ref/models/querysets/#values
Queryset Anda akan menampilkan dict alih-alih instance model. Dan Anda tidak akan mendapatkan daftar product_type
nice yang bagus s... sebagai gantinya Anda akan mendapatkan baris berulang seperti:
[
{'id': 1, 'user_id': 1, 'product_type': 'chair'},
{'id': 1, 'user_id': 1, 'product_type': 'table'},
{'id': 2, 'user_id': 3, 'product_type': 'chair'},
...
]
...jadi Anda harus mengelompokkan baris-baris ini dengan python ke dalam struktur data yang Anda inginkan:
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'])