एकल क्वेरीसेट के साथ डेटाबेस रिकॉर्ड का चयन करें और अपडेट करें


139

मैं दो प्रश्न करने के बजाय उसी पर updateऔर selectकथनों को कैसे चलाता हूं queryset: - एक वस्तु का चयन करने के लिए - और एक वस्तु को अद्यतन करने के लिए

SQL में समतुल्य कुछ इस तरह होगा:

update my_table set field_1 = 'some value' where pk_field = some_value

जवाबों:


267

क्वेरी ऑब्जेक्ट ऑब्जेक्ट updateविधि का उपयोग करें :

MyModel.objects.filter(pk=some_value).update(field1='some value')

95
बस एक उचित चेतावनी ... यदि आप updateइस तरह से विधि का उपयोग करते हैं तो उस मॉडल या अन्य "कोड सामान" से जुड़े कोई भी संकेत वस्तुओं के खिलाफ नहीं चलेंगे। जले हुए व्यक्ति से बस एक सूचक :)
डीएमएसी विध्वंसक

उस मूल्यवान जानकारी के लिए @DMactheDestroyer दोस्त धन्यवाद। फिर क्या हमें इसे अपडेट करने के पुराने तरीके का इस्तेमाल करना चाहिए? (यानी) मिलता है और बचाना है?

@ अच्छी तरह से दोस्त, यह सब आपके परिदृश्य पर निर्भर करता है। updateबड़े पैमाने पर अपडेट के लिए यह विधि बहुत बढ़िया है, लेकिन इसका उपयोग आपके सिर में एक चेतावनी सेट करने के लिए किया जाना चाहिए, जब आप इसका उपयोग करते हैं, तो आपको उस ऑब्जेक्ट से जुड़े किसी भी सिग्नल की समीक्षा करने की आवश्यकता होती है, जिसे मैन्युअल रूप से निकाल दिया जाना चाहिए
डीएमएसी डिस्ट्रॉयर

3
क्या अपडेट फ़ंक्शन में वर्तमान मॉडल का उपयोग करना संभव है? जैसेMyModel.objects.filter(pk=some_value).update(field1=self.data)
दिपक

8
@DipakChandranP आपको छह साल पुरानी टिप्पणी पर टिप्पणी करने के बजाय एक नया प्रश्न पूछना चाहिए। लेकिन एफ () भाव शायद आप चाहते हैं।
डैनियल रोसमैन

70

Django डेटाबेस ऑब्जेक्ट्स ऑब्जेक्ट बनाने और बदलने के लिए समान सहेजें () विधि का उपयोग करते हैं।

obj = Product.objects.get(pk=pk)
obj.name = "some_new_value"
obj.save()

Django को UPDATE बनाम INSERT के बारे में कैसे पता चलता है।
यदि ऑब्जेक्ट की प्राथमिक कुंजी विशेषता एक मान पर सेट है जो True (यानी, कोई भी या खाली स्ट्रिंग के अलावा कोई मूल्य) का मूल्यांकन करता है, तो Django एक UPDATE को निष्पादित करता है। यदि ऑब्जेक्ट की प्राथमिक कुंजी विशेषता सेट नहीं है या यदि UPDATE ने कुछ भी अपडेट नहीं किया है, तो Django एक INSERT निष्पादित करता है।

रेफरी: https://docs.djangoproject.com/en/1.9/ref/models/instances/


17

यह उत्तर उपरोक्त दो दृष्टिकोणों की तुलना करता है। यदि आप एक ही पंक्ति में कई वस्तुओं को अद्यतन करना चाहते हैं, तो इसके लिए जाएं:

# Approach 1
MyModel.objects.filter(field1='Computer').update(field2='cool')

अन्यथा आपको क्वेरी सेट पर अलग करना होगा और व्यक्तिगत वस्तुओं को अपडेट करना होगा:

#Approach 2    
objects = MyModel.objects.filter(field1='Computer')
for obj in objects:
    obj.field2 = 'cool'
    obj.save()
  1. दृष्टिकोण 1 अधिक तेज़ है क्योंकि, यह दृष्टिकोण 2 की तुलना में केवल एक डेटाबेस क्वेरी बनाता है, जो 'n + 1' डेटाबेस क्वेरी बनाता है। (क्वेरी सेट में n आइटम के लिए)

  2. मुट्ठी दृष्टिकोण एक डीबी क्वेरी यानी UPDATE करता है, दूसरा एक दो बनाता है: SELECT और फिर UPDATE।

  3. ट्रेडऑफ़ वह है, मान लीजिए कि आपके पास कोई ट्रिगर्स है, जैसे कि अद्यतन updated_onया इस तरह के किसी भी संबंधित फ़ील्ड में, यह सीधे अपडेट यानी दृष्टिकोण 1 पर ट्रिगर नहीं होगा।

  4. दृष्टिकोण 1 का उपयोग क्वेरी पर किया जाता है, इसलिए एक साथ कई वस्तुओं को अपडेट करना संभव है, दृष्टिकोण 2 के मामले में नहीं।


के बारे में 1. - मुझे लगता है कि क्वेरी का परिणाम क्वेरी के लिए पहली कॉल पर कैश हो जाता है, इसलिए वास्तव में अभी भी डीबी के लिए सिर्फ एक कॉल है।
user2340939 12

2

केवल serializerचीजों में एक मामले में , आप बहुत ही सरल तरीके से अपडेट कर सकते हैं!

my_model_serializer = MyModelSerializer(
    instance=my_model, data=validated_data)
if my_model_serializer.is_valid():

    my_model_serializer.save()

केवल formबातों में एक मामले में !

instance = get_object_or_404(MyModel, id=id)
form = MyForm(request.POST or None, instance=instance)
if form.is_valid():
    form.save()

मुझे लगता है कि सीरियलाइजर्स Djanog Rest Framework और Django उचित नहीं हैं।
कोड-अपरेंटिस

1
हाँ, हालांकि Django formDjango उचित से है।
जमील नोयडा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.