Đây không phải là điều bạn có thể hoặc nên cố gắng đạt được với chú thích bộ truy vấn. Điều này là do chú thích chỉ có thể sử dụng cho các hàm tổng hợp như Count
, Sum
vv
Nếu tôi hiểu đúng câu hỏi của bạn, bạn có thể nhận được thông tin này khi lặp lại bộ truy vấn:
for order in Order.objects.all():
types = order.details.values_list('product_type', flat=True)
Bạn có thể làm cho việc này hiệu quả hơn bằng cách tìm nạp trước OrderDetail
có liên quan hàng cho mỗi đơn đặt hàng:
for order in Order.objects.prefetch_related('details'):
types = order.details.values_list('product_type', flat=True)
Ngoài ra, bạn có thể truy xuất một số giá trị từ mỗi đơn đặt hàng bằng phương pháp này:
queryset = Order.objects.values('id', 'user_id', 'details__product_type')
Nó sẽ thực hiện một truy vấn db duy nhất. Tuy nhiên, hãy xem ghi chú tại đây về cách hoạt động của điều này: https:/ /docs.djangoproject.com/en/1.9/ref/models/querysets/#values
Bộ truy vấn của bạn sẽ xuất ra các số thay vì các phiên bản mô hình. Và bạn sẽ không nhận được danh sách product_type
đẹp s ... thay vào đó bạn sẽ nhận được các hàng lặp lại như:
[
{'id': 1, 'user_id': 1, 'product_type': 'chair'},
{'id': 1, 'user_id': 1, 'product_type': 'table'},
{'id': 2, 'user_id': 3, 'product_type': 'chair'},
...
]
... vì vậy, sau đó bạn sẽ phải nhóm các hàng này trong python thành cấu trúc dữ liệu bạn muốn:
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'])