यह ऐसा कुछ नहीं है जिसे आप क्वेरीसेट एनोटेशन के साथ प्राप्त करने का प्रयास कर सकते हैं या करना चाहिए। ऐसा इसलिए है क्योंकि एनोटेशन केवल 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')
इसे एक डीबी क्वेरी करना चाहिए। हालांकि, यह कैसे काम करता है, इसके बारे में यहां नोट्स देखें:https:/ /docs.djangoproject.com/hi/1.9/ref/models/querysets/#values
आपका क्वेरीसेट मॉडल इंस्टेंस के बजाय डिक्ट्स आउटपुट करेगा। और आपको 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'},
...
]
...तो फिर आपको इन पंक्तियों को अजगर में अपनी इच्छित डेटा संरचना में समूहित करना होगा:
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'])