2016-07-08 28 views
1

Ich habe zwei Modelle. Wenn ich eine Instanz von der ersten speichern möchte, muss ich einen Feldwert von diesem Modell in das Feld des anderen Felds senden.Vermeiden Sie es, eine Instanz in einem pre_save-Signal zu speichern, ohne Raise zu verwenden. Ausnahme

Erstes Modell:

class ModelOne(models.Model): 
    # fields... 
    quantity = models.FloatField() 

Zweites Modell:

class ModelTwo(models.Model): 
    # fields... 
    quantity = models.FloatField() 

pre_save Signal:

@receiver(pre_save, sender=ModelOne) 
def verify(sender, instance, **kwargs): 
    # Stuff 
    quantity = instance.quantity 
    founded_model_two = ModelTwo.objects.get("""Something""") 
    future_result = founded_model_two.quantity - quantity 
    if future_result < 0: 
     raise Exception("Cannot be less than zero") 

Ich mag die Instanz speichern zu vermeiden, aber ich will nicht, eine Ausnahme auslösen

Antwort

0

Wenn Sie nicht in pre_save nach Exception Ausschau halten möchten, können Sie es in save Methode tun. Denn im Idealfall sollte pre_save Exception werfen, um das Signal zu beenden.

class ModelOne(models.Model): 
    # fields... 
    quantity = models.FloatField() 


    def save(self): 
     if some_condition: 
      super(ModelOne, self).save() 
     else: 
      return #cancel the save if you return no super save object. 

IMHO, Sie brauchen nicht alles, was zu tun ist und Validators zu überprüfen, ob Sie die Daten gespeichert werden muss, verwenden können. Wenn Sie eine form Daten speichern, verwenden Sie die Formularüberprüfung, um das Speichern der Daten zu beenden.