trigger español python django signals

python - español - Cancelar guardando el modelo cuando se usa pre_save en django



django where to put signals (3)

No estoy seguro de que pueda cancelar el guardado solo con la señal de pre_save. Pero puedes lograrlo fácilmente al anular el método de guardado:

def save(self): if some_condition: super(A, self).save() else: return # cancel the save

Como lo mencionó @Raptor, la persona que llama no sabrá si la operación de guardar fue exitosa o no. Si este es un requisito para usted, observe la otra respuesta que obliga a la persona que llama a lidiar con el caso de "no guardar".

Tengo un modelo:

class A(models.Model): number = models.IntegerField()

Pero cuando llamo a A.save (), quiero asegurarme de que el número sea primordial (u otras condiciones), o que la instrucción de guardado se deba cancelar.

Entonces, ¿cómo puedo cancelar la instrucción de guardar en el receptor de señal pre_save?

@receiver(pre_save, sender=A) def save_only_for_prime_number(sender, instance, *args, **kwargs): # how can I cancel the save here?


Si los datos siempre provienen de un Formulario y usted tiene una prueba directa para determinar si debe guardarse o no, envíelo a través de un validator . Sin embargo, tenga en cuenta que los validadores no son llamados para las llamadas save () que se originan en el backend. Si desea que también se class PrimeNumberField(models.SmallIntegerField) , puede crear un campo personalizado, diga la class PrimeNumberField(models.SmallIntegerField) Si ejecuta su prueba y genera una excepción en el método to_python () de ese campo personalizado, evitará que se guarde . También puede conectarse a la validación de un campo específico anulando cualquiera de los otros métodos en el campo, formulario o Model .


Ver mi otra respuesta: https://.com/a/32431937/2544762

Este caso es normal, si solo queremos evitar el guardado, inicie una excepción:

from django.db.models.signals import pre_save, post_save @receiver(pre_save) def pre_save_handler(sender, instance, *args, **kwargs): # some case if case_error: raise Exception(''OMG'')