2016-03-31 5 views
6

मेरे पास एक मॉडल फ़ाइल है जो post_save सिग्नल का उपयोग किसी अन्य तालिका में एक लिंक पंक्ति बनाने के लिए करती है। सामान्य रूप से, मैं अपने विचारों में से एक पृष्ठ बना सकता हूं जो @ banking.atomic से सजाया गया है।क्या डीजेंगो संकेत भी लेनदेन के अंदर शामिल हैं। सैटिक सजावटी?

मैं जानना चाहता हूं कि यह सजावटी पृष्ठ ऑब्जेक्ट और साझा लेनदेन ऑब्जेक्ट को उसी लेनदेन में रखेगा या नहीं। यह django दस्तावेज़ों से स्पष्ट नहीं है कि सिग्नल इस परमाणु लेनदेन का हिस्सा हैं।

models.py

class Page(models.Model): 
    name = models.CharField(default='My default page',max_length=200,blank=False) 
    created_at = models.DateTimeField(auto_now_add=True) 
    owner = models.ForeignKey(User, on_delete=models.CASCADE) 
    slug = models.SlugField() 
    uuid = models.UUIDField(default=uuid.uuid4, editable=False) 
    is_public = models.BooleanField(default=False) 

    def __str__(self):    # __unicode__ on Python 2 
     return self.name 

    class Meta: 
     ordering = ['position','created_at'] 

@receiver(post_save, sender=Page) 
def create_shared_page_entry(sender, instance, created, **kwargs): 
    if created: 
     shared_page = SharedPage.objects.create(
      page=instance, 
      user=instance.user, 
      can_edit=True 
     ) 

view.py

@require_http_methods(["POST"]) 
@transaction.atomic 
def page_create(request): 
    name = request.POST.get('name') 
    page = Page.objects.create(name=name, owner=request.user) 

    data = serializers.serialize("json", [page]) 
    return HttpResponse(data, content_type='application/json') 

उत्तर

3

हाँ, संकेत कनेक्शन के autocommit की स्थापना के लिए एक ही मूल्य (जो transaction.commit से बदलाव किया गया है के साथ भेज दिया जाता है सजावट), जिसका उपयोग मॉडल को बचाने के लिए किया जाता है।() Django.db.models.base.Model.save_base में कोड विधि,

if not meta.auto_created: 
     signals.pre_save.send(sender=origin, instance=self, raw=raw, using=using, update_fields=update_fields) 

    with transaction.atomic(using=using, savepoint=False): 
     if not raw: 
      self._save_parents(cls, using, update_fields) 
     updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) 
    # Store the database on which the object was saved 
    self._state.db = using 
    # Once saved, this is no longer a to-be-added instance. 
    self._state.adding = False 

    # Signal that the save is complete 
    if not meta.auto_created: 
     signals.post_save.send(sender=origin, instance=self, created=(not updated),update_fields=update_fields, raw=raw, using=using) 

आप देख सकते हैं, कोई विशेष कोड autocommit सेटिंग में बदलाव करने की चर्चा करते हुए लिखा है। इसलिए, यदि आपका विचार घोषित करता है कि सभी डेटाबेस से संबंधित सामानों को @ banking.atomic का उपयोग करके परमाणुता सुनिश्चित करनी चाहिए, तो आपके दृश्य (या तो model.save() या सिग्नल हैंडलर के माध्यम से किए गए डीबी परिवर्तन), आपके विचार तक प्रतिबद्ध नहीं है निष्पादन समाप्त हो गया है।

मुझे उम्मीद है कि यह आपकी मदद कर सकता है।

संबंधित मुद्दे