Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

एक से कई संबंधों में Django क्वेरी

यह ऐसा कुछ नहीं है जिसे आप क्वेरीसेट एनोटेशन के साथ प्राप्त करने का प्रयास कर सकते हैं या करना चाहिए। ऐसा इसलिए है क्योंकि एनोटेशन केवल 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'])


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL चयन पंक्ति को तब तक लॉक करें जब तक कि उस पर UPDATE नहीं चलाया गया हो?

  2. MySQL में एन्क्रिप्टेड डेटा के लिए BLOB या VARBINARY का उपयोग करें?

  3. समूह और कुल गिनती द्वारा गिनती प्राप्त करने के लिए mysql क्वेरी

  4. लार्वेल के साथ चलाने के लिए MySQL 8 कैसे प्राप्त करें?

  5. PHP परिणाम तालिका में हटाएं बटन जोड़ें