python - उदाहरण के तुरंत अपडेट करने के लिए django में post_save




django-models (2)

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

def my_handler(sender, instance=False, **kwargs):
    t = Test.objects.filter(id=instance.id)
    t.blah = 'hello'
    t.save()

class Test(models.Model):
    title = models.CharField('title', max_length=200)
    blah = models.CharField('blah', max_length=200)

post_save.connect(my_handler, sender=Test)

इसलिए 'अतिरिक्त' फ़ील्ड को प्रत्येक सहेजे के बाद 'हैलो' पर सेट किया जाना माना जाता है। सही बात? लेकिन यह काम नहीं कर रहा है

कोई विचार?


जब आप प्रेषक वर्ग के किसी ऑब्जेक्ट को अपडेट करने के लिए एक पोस्ट_एसएव सिग्नल का इस्तेमाल करते हैं तो संभावना है कि आपको सहेजने की विधि को ओवरराइड करना चाहिए। आपके मामले में, मॉडल की परिभाषा इस प्रकार दिखाई देगी:

class Test(models.Model):
    title = models.CharField('title', max_length=200)
    blah = models.CharField('blah', max_length=200)

    def save(self, force_insert=False, force_update=False):
        if not self.blah:
            self.blah = 'hello'
        super(Test, self).save(force_insert, force_update)

पोस्ट_एसएव हैंडलर क्या उदाहरण नहीं लेता है? आप इसे का उपयोग करके फ़िल्टर क्यों कर रहे हैं? क्यों न करें:

def my_handler(sender, instance=False, created, **kwargs):
  if created:
     instance.blah = 'hello'
     instance.save()

आपका मौजूदा कोड काम नहीं करता क्योंकि यह लूप है, और Test.objects.filter(id=instance.id) एक क्वेरी सेट देता है, ऑब्जेक्ट नहीं। एकल ऑब्जेक्ट को सीधे प्राप्त करने के लिए, Queryset.get() उपयोग करें लेकिन आपको ऐसा करने की ज़रूरत नहीं है। निर्मित तर्क इसे पाशन से रखता है, क्योंकि यह केवल पहली बार सेट करता है।

सामान्य तौर पर, जब तक आपको पोस्ट_एसएव सिग्नल का उपयोग करने की आवश्यकता नहीं हो, तो आपको अपने ऑब्जेक्ट की सहेजना () विधि को ओवरराइड करना चाहिए।







django-models