2017-02-28 3 views
0

Ich habe zwei Modelle, von denen eines Daten aus dem anderen Modell verwendet, um seine eigenen Felder zu füllen. Das Problem ist, dass das zweite Modell beim Aktualisieren des ersten Modells auch nicht seine eigenen Felder aktualisiert. Ich muss rein und bearbeite/speichere das 2. Modell für seine zu aktualisierenden Felder.Django - Verwenden Sie Signale, um die Felder eines anderen Modells zu aktualisieren

Etwas wie folgt aus:

models.py:

class ModelA(models.ModelForm) 
    ... 

class ModelB(models.ModelForm) 
    count_number_of_model_A = models.IntegerField 
    def save(self) 
     self.count_number_of_model_A = ModelA.objects.all().count() 
     super(ModelB, self).save() 

(dies ist eine vereinfachte Version von dem, was ich versuche zu tun)

Jetzt habe ich das Feld "count_number_of_model_A" wollen in ModelB, um jedes Mal zu aktualisieren, wenn ModelA geändert wird. Im Moment wird es nur aktualisiert, wenn ich ModelB tatsächlich modifiziere und speichere.

Ich denke, die Antwort ist die Verwendung von Signalen (vielleicht?). Ich versuche, ein Signal einzurichten, sodass ModelB aktualisiert wird, wenn ein neues Objekt in ModelA erstellt wird. Ich habe folgendes:

@receiver(post_save, sender=ModelA) 
def update_sends(sender, **kwargs): 
    if kwargs.get('created', False): 
     #some code here to refresh ModelB?? 

Das Signal richtig funktioniert, als ob ich in so etwas wie ModelB.objects.filter (einige Filter) .update (einige Feld) setzen, diese Änderungen widerspiegeln, wenn ich hineingehen und Erstellen Sie ein neues ModelA-Objekt. Aber das ganze Modell selbst wird nicht aktualisiert, und das fragliche Feld ("count_number_of_model_A") wird nicht aktualisiert.

Irgendwelche Hilfe?

Antwort

1

Verwenden Sie einfach:

for model_b in ModelB.objects.filter(<some_filter>): 
    model_b.save() 

Aber sollten Sie sich bewusst sein, dass dies zieht alle (gefiltert) zu Django-Objekte, da mit ihnen etwas zu tun und speichert sie in der Datenbank zurück. Dies ist viel langsamer als mit query expressions. Sie werden ein bisschen mehr Arbeit haben, um es einzurichten, aber es wird viel schneller laufen - besonders wenn die Datenbank wächst.

+0

Das hat super funktioniert! Vielen Dank! Meine DB ist ziemlich klein, also mache ich mir keine Sorgen, dass es langsamer wird, aber ich werde versuchen, es umzudrehen. Danke für Ihre Hilfe! – Josh

Verwandte Themen