J'ai un fichier modèle qui utilise un signal post_save
pour créer une ligne liée dans une autre table. De façon typique, je peux créer une page à partir d'une de mes vues qui est décorée avec @ transaction.atomic.Les signaux django sont-ils également inclus dans la transaction.atomic décorator?
Je voudrais savoir si ce décorateur mettra la création de l'objet Page et de l'objet SharedPage dans la même transaction. Il n'est pas clair à partir des docs django que les signaux font partie de cette transaction atomique.
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')