2012-08-24 17 views
8

निम्नलिखित सेटअप में, मुझे प्रोजेक्ट्स की एक सूची के साथ एक क्वेरीसेट चाहिए, प्रत्येक अपनी कार्य अवधि (कार्यों के रूप में) के योग के साथ एनोटेटेड और उसके सभी कार्यों का योग ' subtask अवधि (subtasks_duration के रूप में)। मेरे मॉडल (सरलीकृत) इस तरह दिखेगा:एकाधिक एनोटेट योग शब्द बढ़ते उत्तर

Projects.objects.annotate(tasks_duration=Sum('task__duration'), subtasks_duration=Sum('task__subtask__duration')) 

व्यवहार से संबंधित Django annotate() multiple times causes wrong answers में विस्तार से बताया मैं एक tasks_duration बहुत अधिक की तुलना में यह होना चाहिए कि मिल:

class Project(models.Model): 
    pass 

class Task(models.Model): 
    project = models.ForeignKey(Project) 
    duration = models.IntegerField(blank=True, null=True) 

class SubTask(models.Model): 
    task = models.ForeignKey(Task) 
    duration = models.IntegerField(blank=True, null=True) 

मैं इस तरह मेरी क्वेरीसमूह बनाते हैं। एकाधिक एनोटेट (Sum()) खंड परिणामस्वरूप एसक्यूएल में कई बाएं आंतरिक जुड़ते हैं। कार्यों_ अवधि के लिए केवल एक ही एनोटेट (Sum()) शब्द के साथ, परिणाम सही है। हालांकि, मैं दोनों कार्य_ अवधि और subtasks_duration दोनों चाहते हैं।

इस प्रश्न को करने का एक उपयुक्त तरीका क्या होगा? मेरे पास एक कामकाजी समाधान है जो प्रति परियोजना करता है, लेकिन यह अपेक्षाकृत असामान्य रूप से धीमा है। मेरे पास एक अतिरिक्त() कॉल के साथ कुछ भी काम कर रहा है, लेकिन मैं वास्तव में जानना चाहता हूं कि शुद्ध Django के साथ मैं क्या चाहता हूं।

+0

आप का प्रयास किया था 'tasks_duration = योग ('task__duration', अलग = सच), subtasks_duration = योग ('task__subtask__duration', अलग = सच)' के रूप में आपके द्वारा जुड़े दूसरे प्रश्न में उल्लिखित? – jpic

+0

यह केवल विशिष्ट अवधि मानों को पूरा करेगा, जो मैं नहीं चाहता हूं। जिज्ञासा से मैंने कोशिश की, अभी भी वही गलत मूल्य उत्पन्न करता है। (अवधि भिन्न होती है) –

+0

कभी इसके लिए कोई समाधान मिलते हैं? मैं एक क्वेरीसेट पर एक योग और गिनती को एनोटेट करने की कोशिश कर रहा हूं, और राशि गुणा हो रही है ... – StephenTG

उत्तर

1

मुझे यह त्रुटि भी मिलती है। सटीक एक ही कोड। यह काम करता है अगर मैं अलग-अलग एकत्रीकरण करता हूं, लेकिन एक बार जब मैं एक ही समय में दोनों रकम प्राप्त करने का प्रयास करता हूं, तो उनमें से एक कारक 2 अधिक होता है, और दूसरा कारक 3 होता है।

मुझे नहीं पता कि Django इस पर क्यों व्यवहार करता है मार्ग। मैंने यहां एक बग रिपोर्ट दायर की है: https://code.djangoproject.com/ticket/19011 आपको इसका अनुसरण करने में भी रुचि हो सकती है।

+0

यह वास्तव में Django में एक बग नहीं है लेकिन डेटाबेस में इन समेकित प्रश्नों को बनाने की जटिलता की समस्या है। भले ही आपने स्वयं एसक्यूएल लिखा हो, आपको इस समस्या को हल करना होगा। – benjaoming

+1

प्रासंगिक बग रिपोर्ट से लिंक करें: https://code.djangoproject.com/ticket/10060 – benjaoming

+0

यह बग अभी भी तय नहीं है। – sobolevn

1

बग की रिपोर्ट here है लेकिन यह अभी तक Django 1.11 में हल नहीं है। यह मुद्दा रिवर्स रिलेशनशिप में दो टेबलों में शामिल होने से संबंधित है। ध्यान दें कि विशिष्ट पैरामीटर गणना के लिए अच्छा काम करता है लेकिन Sum के लिए नहीं। तो अगर आप एक चाल का उपयोग करें और लिखना नीचे की तरह एक ORM कर सकते हैं:

Projects.objects.annotate(
     temp_tasks_duration=Sum('task__duration'), 
     temp_subtasks_duration=Sum('task__subtask__duration'), 
     tasks_count=Count('task'), 
     tasks_count_distinct=Count('task', distinct=True), 
     task_subtasks_count=Count('task__subtask'), 
     task_subtasks_count_distinct=Count('task__subtask', distinct=True), 
).annotate(
     tasks_duration=F('temp_tasks_duration')*F('tasks_count_distinct')/F('tasks_count'), 
     subtasks_duration=F('temp_subtasks_duration')*F('subtasks_count_distinct')/F('subtasks_count'), 
) 
संबंधित मुद्दे