database - जेनेटो मॉडल में '0' के रूप में नेल का इलाज करें



django model (2)

एनोटेशन की शुरूआत से पहले, आपने ऐसा कुछ करने के लिए extra इस्तेमाल किया हो सकता है, मुझे लगता है कि ऐसे मामलों में 0 वापस जाना चाहिए जहां कोई मत नहीं है (यदि यह किसी विशेष डेटाबेस कार्यान्वयन के लिए नहीं है, तो आप कम से कम सीधे सम्मिलित कर सकते हैं आवश्यक COALESCE फ़ंक्शन कॉल - COALESCE(SUM(value), 0) - इस विधि का उपयोग करना:

pictures = gallery.picture_set.extra(
    select={
        'score': 'SELECT SUM(value) FROM yourapp_picturevote WHERE yourapp_picturevote.picture_id = yourapp_picture.id',
    },
    order_by=['-score']
)

मुझे नई एनोटेशन सामग्री (जो मैंने अभी तक व्यक्तिगत रूप से उपयोग नहीं किया है) में अपना स्वयं का एसक्यूएल जोड़ने के लिए कोई भी अंतर्निहित तरीके नहीं देख सकता, लेकिन ऐसा लगता है कि आप इस तरह एक नया एनोटेशन बनाने में सक्षम होना चाहिए:

from django.db.models import aggregates
from django.db.models.sql import aggregates as sql_aggregates

class SumWithDefault(aggregates.Aggregate):
    name = 'SumWithDefault'

class SQLSumWithDefault(sql_aggregates.Sum):
    sql_template = 'COALESCE(%(function)s(%(field)s), %(default)s)'

setattr(sql_aggregates, 'SumWithDefault', SQLSumWithDefault)

django.db.models.sql.aggregates समेकित वर्गों की तरफ देखने के तरीके के कारण आपको नए सामग्रियों को बंद करने की जरूरत है, लेकिन यह सब django.db.models.sql.aggregates , परन्तु जो भी हमने किया है, वह एक नया कुल मिलाकर Sum , जो उप-वर्गों में Sum , COALESCE फ़ंक्शन को कॉल करने के लिए हार्डकोडिंग और डिफ़ॉल्ट मान के लिए एक प्लेसहोल्डर जोड़ना, जिसे आपको कीवर्ड तर्क के रूप में प्रदान करना होगा (कम से कम यह बहुत ही बुनियादी उदाहरण कार्यान्वयन में)।

यह आपको निम्न कार्य करने देनी चाहिए:

pictures = gallery.picture_set.annotate(score=SumWithDefault('picturevote__value', default=0).order_by('-score')

https://src-bin.com

मैं अपने डीजेंगो ऐप में निम्न बिट कोड का उपयोग करता हूं:

pictures = gallery.picture_set.annotate( score=models.Sum( 'picturevote__value' ) ).order_by( '-score' )

दीर्घाओं का एक टेबल है उनमें से प्रत्येक में कुछ तस्वीरें हैं जब कोई उपयोगकर्ता किसी चित्र को ऊपर या नीचे उठाता है, तो 'चित्रविट' में एक नई पंक्ति को चित्रित किया जाता है और चित्र से जुड़ा हुआ है। तो मैं चित्रों के लिए कुल स्कोर प्राप्त कर सकता हूं। अब मैं अपने स्कोर मूल्यों के आधार पर एक गैलरी की तस्वीरों को ऑर्डर करना चाहता हूं। लेकिन तालिका में शामिल होने के कारण स्कोर के लिए मूल्य शून्य हो सकता है जब सभी पर कोई वोट नहीं होता। फिर भी 'शून्य' का अंक '0' के रूप में माना जाएगा

कोई विचार?

संपादित करें: ठीक है, यहाँ कुछ अतिरिक्त स्पष्टीकरण है: समस्या यह है कि उपरोक्त उदाहरण में एकत्रण नल score सेट करता है जब मैं स्कोर प्रदर्शित करना चाहता हूं तो मैं इस तरह से कुछ का उपयोग करता हूं:

score = self.picturevote_set.aggregate( models.Sum( 'value' ) )[ 'value__sum' ] or 0

फिर एकत्रीकरण या तो किसी नल (या कोई चित्रविस्तार पंक्तियां नहीं) या एक निश्चित मूल्य की ओर जाता है यदि यह नल है या अभिव्यक्ति उसे एक डिस्प्लेबल पूर्णांक मान में कनवर्ट करता है। लेकिन यह केवल प्रदर्शन समस्याओं को हल करता है जो शून्य मान के कारण होते हैं। जब मैं पहले score के उदाहरण के रूप में इस score मान के चित्रों को सॉर्ट करना चाहता हूं, तो नल के साथ सभी प्रविष्टियां ऑर्डर किए गए परिणाम सेट के अंत में डाल दी जाती हैं। सबसे पहले सकारात्मक स्कोर वाले चित्र हैं, फिर नकारात्मक मूल्यों वाले चित्र हैं और फिर ऐसे चित्र हैं जो अब तक ऊपर या नीचे मतदान नहीं किए गए थे, क्योंकि score रूप में उनके पास शून्य है।

मेरा प्रश्न यह है कि यह व्यवहार कैसे बदला जा सकता है ताकि ऑर्डर सही हो।


Answer #1

Django 1.8 से, एक Coalesce डेटाबेस फ़ंक्शन है। आपकी क्वेरी इस तरह दिखाई दे सकती है:

from django.db.models.functions import Coalesce    

score = self.picturevote_set.aggregate(Coalesce(models.Sum('value'), 0))




model