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