2012-11-26 24 views
10

मैं निम्नलिखित मॉडल:एनोटेटेड एक क्वेरीसेट को कैसे अपडेट करें?

class Work(models.Model): 
    visible = models.BooleanField(default=False) 

class Book(models.Model): 
    work = models.ForeignKey('Work')  

मैं तो जैसे कुछ पंक्तियां अपडेट करने का प्रयास कर रहा हूँ:

DatabaseError: सबक्वेरी भी कई है

qs=Work.objects.all() 
qs.annotate(Count('book')).filter(Q(book__count__gt=1)).update(visible=False) 

बहरहाल, यह एक त्रुटि दे रहा है कॉलम लाइन 1: ... सेट "दृश्यमान" = झूठी कहां "app_work"। "आईडी" में (चयन करें ...

यदि मैं टी को हटाता हूं वह खंड अद्यतन करता है, क्वेरी बिना किसी समस्या के चलती है और जो मैं उम्मीद कर रहा हूं वह लौटाती है।

ऐसा लगता है कि यह त्रुटि एक एनोटेट के साथ एक अद्यतन के बाद पूछताछ के लिए होती है। क्या यह लिखने का कोई और तरीका है?

उत्तर

10

खिलौना डेटाबेस बनाने के बिना अपनी समस्या को डुप्लिकेट करने और समाधानों को आज़माने में सक्षम होने के कारण, मैं कम से कम Django: Getting complement of queryset में एक संभावित दृष्टिकोण के रूप में दृष्टिकोण का सुझाव दे सकता हूं। मैं इस मुद्दे & दोहराया गया है

qs.annotate(Count('book')).filter(Q(book__count__gt=1)) 
Work.objects.filter(pk__in=qs.values_list('pk', flat=True)).update(visible=False) 
+0

मुझे वास्तव में पूरक की आवश्यकता नहीं है। क्वेरी सही पंक्तियों को वापस कर रही है, लेकिन समस्या यह है कि मैं उन्हें अद्यतन नहीं कर सकता। – jess

+0

दाएं। मेरा मुद्दा यह है कि आप एक अनन्य क्वेरीसेट प्राप्त करने के लिए एक ही मूल दृष्टिकोण का उपयोग कर सकते हैं जो थोक-अद्यतन होना चाहिए। – acjay

+2

@ जेस: मैंने अभी जो भी मतलब है उसका एक उदाहरण शामिल करने के लिए संपादित किया है। मुझे बताएं कि क्या वह काम करता है – acjay

2

तुम भी एक क्वेरीसमूह काफी बस बंद एनोटेशन स्पष्ट कर सकते हैं:

qs.query.annotations.clear() 
qs.update(..) 

और यह मतलब है कि आप केवल एक ही प्रश्न बंद फायरिंग कर रहे हैं , एक दूसरे में नहीं, लेकिन यदि आपकी क्वेरी फ़िल्टर करने के लिए एनोटेशन पर निर्भर करती है तो इसका उपयोग न करें। डेटाबेस-जेनरेटेड कॉन्सटेनेशन को अलग करने के लिए यह बहुत अच्छा है, और उपयोगिता कचरा है कि मैं कभी-कभी मॉडल के डिफ़ॉल्ट प्रश्नों में जोड़ता हूं ... लेकिन प्रश्न में उदाहरण यह एक आदर्श उदाहरण है कि यह कहां काम नहीं करेगा।

0

ओली का जवाब देने के लिए जोड़ने के लिए: आप तो फिल्टर पहले क्या अद्यतन के लिए अपनी टिप्पणियों को जरूरत है और एक चर में परिणाम की दुकान और फिर तो जैसे update समारोह का उपयोग करने की है कि क्वेरीसमूह पर कोई तर्क के साथ फिल्टर कॉल करते हैं:

q = X.objects.filter(annotated_val=5, annotated_name='Nima') 
q.query.annotations.clear() 
q.filter().update(field=900) 
संबंधित मुद्दे