किसी मॉडल में केवल विशिष्ट फ़ील्ड अपडेट करें


92

मेरे पास एक मॉडल है

class Survey(models.Model):
    created_by = models.ForeignKey(User)
    question = models.CharField(max_length=150)
    active = models.NullBooleanField()
    def __unicode__(self):
        return self.question

और अब मैं केवल activeफ़ील्ड अपडेट करना चाहता हूं । इसलिए मैं यह करता हूं:

survey = get_object_or_404(Survey, created_by=request.user, pk=question_id)
survey.active = True
survey.save(["active"]) 

अब मुझे एक त्रुटि मिलती है IntegrityError: PRIMARY KEY must be unique

क्या मैं अपडेट करने के लिए इस विधि के साथ सही हूं?

जवाबों:


186

फ़ील्ड के सबसेट को अपडेट करने के लिए, आप इसका उपयोग कर सकते हैं update_fields:

survey.save(update_fields=["active"]) 

update_fieldsतर्क Django 1.5 में जोड़ा गया है। पहले के संस्करणों में, आप update()इसके बजाय विधि का उपयोग कर सकते थे :

Survey.objects.filter(pk=survey.pk).update(active=True)

17

आमतौर पर, एक या अधिक मॉडल उदाहरणों में कुछ फ़ील्ड्स को अपडेट करने का सही तरीका update()संबंधित क्वेरीसेट पर विधि का उपयोग करना है । फिर आप कुछ इस तरह से करें:

affected_surveys = Survey.objects.filter(
    # restrict your queryset by whatever fits you
    # ...
    ).update(active=True)

इस तरह, आपको save()अपने मॉडल पर अब कॉल करने की आवश्यकता नहीं है क्योंकि यह स्वचालित रूप से सहेजा जाता है। इसके अलावा, update()विधि आपके सर्वेक्षण से प्रभावित सर्वेक्षण उदाहरणों की संख्या लौटाती है।


2
धन्यवाद। मैं .getइसके बजाय के साथ की कोशिश की .filterऔर यह काम नहीं करता है। लेकिन फिल्टर के साथ यह अच्छा काम करता है। क्या आप जानते हैं कि ऊपर दिए गए मेरे कोड में क्या गलत है?
पंजीकृत उपयोगकर्ता

आपकी समस्या संबंधित हो सकती है question_id। यह मूल्य कहां से आता है? और कौन सी सटीक रेखा उठाती है IntegrityError?
पेमिस्टहल

question_idurls से आता है (?P<question_id>\d+)। मेरा दोष यह था कि काम करने वाले सर्वर पर django 1.4 स्थापित है और मेरा कोड 1.5 है। लेकिन आपके कोड के साथ यह ठीक काम कर रहा है।
पंजीकृत उपयोगकर्ता

2
@RegisteredUser, ऐसा लगता है कि क्वेरीज़ पर ऑब्जेक्ट्स पर कोई "अपडेट" विधि नहीं है। जब आप .filter () का उपयोग करते हैं, तो आपको एक क्वेरीसेट (शून्य या अधिक ऑब्जेक्ट्स को पकड़कर) वापस मिलती है। जब आप उपयोग करते हैं .get () आपको एक ही वस्तु मिलती है।
मोहनजहां

डिफ़ॉल्ट रूप से, कॉलिंग save()(@Alasdair समाधान) एक सुरक्षित समाधान है, क्योंकि यह विधि सत्यापन, या किसी कस्टम कोड जैसी चीज़ों को ट्रिगर update()नहीं कर सकती है।
डेविड डी।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.