मैं सबक्वायरी के अंदर किसी अन्य मॉडल से फ़ील्ड का योग वापस करने का प्रयास कर रहा हूं।

मेरा मुख्य क्वेरीसेट टाइप कंपनी के सभी उपयोगकर्ताओं को लौटाता है। मुझे CreditOrder से डेटा लेकर उपयोग किए गए कुल क्रेडिट को वापस करना होगा और क्रेडिट_यूज्ड फ़ील्ड का योग करना होगा।

मैं django-modelcluster से ClusterableModel और ParentalKey का उपयोग कर रहा हूं

मेरा CreditOrder मॉडल

class CreditOrder(ClusterableModel):
    credit = ParentalKey(
        Credit, on_delete=models.CASCADE, related_name="credit_order"
    )
    order = ParentalKey(Order, on_delete=models.CASCADE, related_name="credit_order")
    credit_used = models.DecimalField(
        max_digits=12, decimal_places=2, null=True, blank=True
    )

मेरा User मॉडल

class User(AbstractUser, ClusterableModel):
    username = models.CharField(max_length=40, null=True, blank=True)
    user_type = models.CharField(max_length=20, choices=TIPO_UTENTE, default="dipendente")

क्लास मॉडल User . का उपयोग करके मेरा क्वेरीसेट

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        qs = qs.filter(user_type='company')
        credits_used_subquery = Subquery(CreditOrder.objects.filter(credit__font__company__id=OuterRef('id')).order_by()
                    .values('credit_used').annotate(credit_used_sum=Sum('credit_used'))
                    .values('credit_used_sum'), output_field=DecimalField())
        qs = qs.annotate(
            _credits_used_sum=credits_used_subquery
        )
        return qs

लेकिन यह त्रुटि मुझे लौटा रही है:

django.db.utils.ProgrammingError: more than one row returned by a subquery used as an expression
0
caiojhonny 7 जुलाई 2021, 11:33

2 जवाब

यदि आपको केवल कंपनी द्वारा उपयोग किए गए सभी क्रेडिट का योग करना है, तो आप यह कर सकते हैं:

qs.annotate(_credits_used_sum=Sum('font__credit__credit_used'))
0
bdbd 7 जुलाई 2021, 12:06

CreditOrder और उपयोगकर्ता के बीच सभी मॉडलों को देखे बिना, यह बताना मुश्किल है कि आपने क्या गलत किया है। ऐसा लगता है कि क्रेडिट मॉडल फ़ॉन्ट से जुड़ा हुआ है और फ़ॉन्ट में कंपनी नामक एक विशेषता हो सकती है जो उपयोगकर्ता मॉडल की एक विदेशी कुंजी है?

किसी भी स्थिति में, आपकी पहली values कॉल में गलत तर्क है, आपको अनिवार्य रूप से उसी चीज़ से समूहित करने की आवश्यकता है जिससे आप बाहरी रेफरी से जुड़े हैं। तो मैं सुझाव दूंगा

.values('credit__font__company__id')

मूल्यों के लिए पहली कॉल में। और एनोटेट और दूसरी कॉल को मूल्यों के समान रखें।

एक अन्य उत्तर एक सबक्वेरी के बजाय एक जॉइन के साथ योग करने का सुझाव देता है, अगर आपको उस एपीआई की सादगी पसंद है, लेकिन आप अभी भी एक सबक्वेरी का उपयोग करना चाहते हैं, तो आप django-sql-utils पैकेज। आपके बाद pip install django-sql-utils

from sql_util.utils import SubquerySum

qs.annotate(_credits_used_sum=SubquerySum('font_credit_credit_used')
0
Brad Martsberger 7 जुलाई 2021, 18:15