type queryset query example python django django-models

queryset - models py python



¿Cómo guardar un modelo sin enviar una señal? (4)

¿Cómo puedo guardar un modelo, de manera que las señales no se envíen? (post_save y pre_save)


Actualmente hay un ticket pendiente de una decisión de diseño de Django para esta característica.

Incluido en el ticket hay una diferencia para un parche con la implementación propuesta.


Es un poco pirateado, pero puedes hacer algo como esto:

use un identificador único con un filtro y luego use el método de actualización del queryset (que no dispara las señales)

user_id = 142187 User.objects.filter(id=user_id).update(name=''tom'')


Este ticket ha sido marcado como "wontfix" porque:

En resumen, parece que, dado el propósito definido de las señales, es el controlador de señales adjunto el que necesita ser más inteligente (como en la sugerencia de davedash), en lugar del código que emite la señal. Desactivar las señales es solo una solución rápida que funcionará cuando sepa exactamente qué controladores están vinculados a una señal, y oculta el problema subyacente al colocar la solución en el lugar equivocado.


Si tiene relaciones mutuas en los modelos y sus señales aún puede desacoplar la lógica de la señal para tener más señales del mismo tipo y manejar su lógica de una manera más sofisticada

Puede comprobar en señales, el estado del objeto:

kwargs[''created'']

Puede verificar el estado de cualquier valor extra pegado: Entonces, en una señal, leerá al principio:

if `kwargs[''instance''].skip_signals`: return

y en otro lugar, antes de save() , solo establecerás esa skip_signals en el objeto específico, en una situación específica. (No hay necesidad de definirlo como campo modelo)

También puedes no emitir señales:

  • anulando método (s) en los modelos,
  • o añadiendo su propio save_without_signals() ,
  • o como ya se mencionó, haciendo filter(pk=<>).update(...)