¿Se incluyen también las señales django dentro del decorador transaction.atomic?

Tengo un archivo de modelo que utiliza una señal post_save para crear una fila vinculada en otra tabla. De manera típica, puedo crear una página desde una de mis vistas que está decorada con @ transaction.atomic.

Me gustaría saber si este decorador pondrá la creación del objeto Page y del objeto SharedPage en la misma transacción. No queda claro en los documentos de django que las señales son parte de esta transacción atómica.

modelos.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 ) 

ver.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') 

Sí, las señales se envían con el mismo valor para la configuración de conexión automática (que está modificada por transaction.commit decorator), que se usa para guardar el modelo. Haciendo referencia al código en el método 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) 

Como puede ver, no se escribe ningún código especial para cambiar la configuración de confirmación automática. Por lo tanto, si su vista declara que todas las cosas relacionadas con la base de datos deben garantizar la atomicidad mediante el uso de @ transaction.atomic, entonces los cambios de db realizados por su vista (ya sea model.save () o mediante manejadores de señales), no se confirmarán, hasta que su vista La ejecución está terminada.

Espero que te pueda ayudar.