5

मेरे पास 'StoreItem' नामक एक मॉडल है और 'QuoteItem' नामक एक मॉडल है। StoreItem पर एक उद्धरण चिह्न।django एनोटेट - सशर्त गिनती

मैं दुकान वस्तुओं पर कितनी बोली वस्तुएं इंगित करता हूं, लेकिन उद्धरण वस्तुओं पर लागू होने वाली स्थितियों के काउंटर को एनोटेट करने का प्रयास कर रहा हूं।

items = items.annotate(
      quote_count=Count(
       Case(
        When(quoteitem__lookup_date__in=this_week, then=1), 
        output_field=IntegerField() 
       ) 
      ) 
     ) 

'आइटम' StoreItems के क्वेरीसमूह हैं:

मैं कुछ इस तरह की कोशिश की। 'this_week' इस सप्ताह का प्रतिनिधित्व करने वाली तिथियों की एक सूची है (यह वह फ़िल्टर है जिसे मैं लागू करने का प्रयास करता हूं)। तारीखों को काम करने के बाद मैं इस सशर्त गिनती में और अधिक फ़िल्टर जोड़ना चाहता हूं लेकिन इसके साथ शुरू करने देता हूं।

वैसे भी क्या मैं हो रही है एक बूलियन की तरह अधिक है - अगर उद्धरण आइटम से मेल खाने वाले हालत मौजूद है, कोई फर्क नहीं पड़ता कि कितने मेरे पास है, काउंटर बाकी 1. हो जाएगा, हो जाएगा 0.

ऐसा लगता है Count(Case()) की तरह ही जांचें कि कोई आइटम मौजूद है और यदि ऐसा है तो 1 लौटाएं, जबकि मैं स्टोर आइटम पर इंगित सभी उद्धरण वस्तुओं पर पुनरावृत्ति करना चाहता हूं और उन्हें गिनना चाहता हूं, अगर वे स्थिति (व्यक्तिगत रूप से) से मेल खाते हैं।

मैं इसे कैसे कर सकता हूं?

उत्तर

7

आप Count के बजाय एक Sum बयान में सब कुछ लपेटो करने की जरूरत है (मुझे लगता है यह थोड़ा अजीब है कि Count काम करता है सभी):

from django.db.models import Case, IntegerField, Sum, When 

items = items.annotate(
     quote_count=Sum(
      Case(
       When(quoteitem__lookup_date__in=this_week, then=1), 
       output_field=IntegerField() 
      ) 
     ) 
    ) 

यह मूलतः सभी 0 और 1 रों के लिए कहते हैं आंतरिक Case कथन, जिसके परिणामस्वरूप मैचों की संख्या की गणना हुई।

0

मैं एक समान कार्य कर रहा था। मेरे लिए, SumCase/When पर काम नहीं कर रहा था क्योंकि मैं कितनी तालिकाओं में शामिल हो रहा था (यह गिनती के रास्ते पर था)। इस तरह समाप्त हुई:

from django.db.models import Case, IntegerField, Count, When, F 

items = items.annotate(
     quote_count=Count(
      Case(
       When(quoteitem__lookup_date__in=this_week, then=F('quoteitem__id'), 
      ), 
      distinct=True, 
     ) 
    ) 

मेरे मामले में मैं वास्तव में एक साथ दो Count जोड़ने के लिए किया था की तरह:

items = items.annotate(
     quote_count=Count(
      Case(
       When(quoteitem__lookup_date__in=this_week, then=F('quoteitem__id'), 
      ), 
      distinct=True, 
     ) 
    ) + Count (
      Case(
       When(itemgroup__lookup_date__in=this_week, then=F('itemgroup__quoteitem__id'), 
      ), 
      distinct=True, 
     ) 

यह मानते हुए कि items या तो एक itemgroup या सीधे के माध्यम से quoteitems से संबंधित हो सकता है।

संबंधित मुद्दे