कैसे और समूह के लिए Django के साथ कुल


83

मेरे पास काफी सरल क्वेरी है जिसे मैं ओआरएम के माध्यम से बनाना चाहता हूं, लेकिन यह पता नहीं लगा सकता है।

मेरे तीन मॉडल हैं:

स्थान (एक स्थान), विशेषता (एक स्थान हो सकता है), और रेटिंग (एक एम 2 एम) 'मॉडल के माध्यम से जिसमें एक स्कोर फ़ील्ड भी शामिल है)

मैं कुछ महत्वपूर्ण विशेषताओं को चुनना चाहता हूं और उन विशेषताओं के आधार पर अपने स्थानों को रैंक करने में सक्षम हूं - अर्थात सभी चयनित विशेषताओं पर बेहतर कुल स्कोर = बेहतर।

मैं निम्नलिखित एसक्यूएल का उपयोग कर सकता हूं जो मुझे चाहिए:

select location_id, sum(score) 
    from locations_rating 
    where attribute_id in (1,2,3) 
    group by location_id order by sum desc;

जो लौटता है

 location_id | sum 
-------------+-----
          21 |  12
           3 |  11

ORM के साथ मैं निकटतम हो सकता है:

Rating.objects.filter(
    attribute__in=attributes).annotate(
    acount=Count('location')).aggregate(Sum('score'))

जो लौटता है

{'score__sum': 23}

अर्थात सभी का योग, स्थान द्वारा समूहीकृत नहीं।

इसके आसपास कोई रास्ता? मैं SQL को मैन्युअल रूप से निष्पादित कर सकता था, लेकिन चीजों को लगातार बनाए रखने के लिए ORM के माध्यम से जाना होगा।

धन्यवाद



जवाबों:


136

इसे इस्तेमाल करे:

Rating.objects.filter(attribute__in=attributes) \
    .values('location') \
    .annotate(score = Sum('score')) \
    .order_by('-score')

3
हममम - एनोटेट नहीं कुल मिलाकर - ऐसा क्यों है?
गाइ बोडेन

51
aggregateannotateव्यक्तिगत (समूहीकृत) पंक्तियों के लिए पूर्ण परिणाम के लिए है।
बोके

क्या किसी को पता है कि 'dict' object has no attribute '_meta'इस तरह के क्वेरी के साथ कैसे हल किया जाए?
मैकीक

हाय @ आमिर, मुझे भी इसी तरह की समस्या है, क्या आप इसे देख सकते हैं? लिंक-यहाँ
Ermir Beqiraj

कुछ इस तरह [{"location": 53, "score": 100}, {"location": 54, "score": 104}]
लौटता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.