2017-03-02 3 views
0

Ich habe so Django Modelle:Modelle Django Überschreibung speichern und neuen Feldwert von verwandten Objekten

class Car(models.Model): 
    rating = models.PositiveIntegerField(
     default=0, 
     verbose_name=_('Rating'), 
    ) 

class ReportInfo(models.Model): 
    car = models.ForeignKey(
     Car, 
     related_name='car_info', 
     verbose_name='Report', 
    ) 

Und ich brauche aus Berichten Bewertung für mein Auto Instanzen einschließlich Informationen zu bilden, in einer solchen Art und Weise:

def save(self, *args, **kwargs): 
    rating = 0 
    for item in self.car_info.all(): 
     rating += 10 
    self.rating = rating 
    super(Car, self).save(*args, **kwargs) 

Also, ich muss alle Berichte von meinem Auto bekommen, dann einige andere Daten aus dem Bericht holen und dann Rating in das Feld speichern. Aber, self.car_info.all() gibt mir alte Daten zurück. Das heißt weiter: Wenn ich auf der Admin-Seite eines neuen Autos auf Speichern klicke, hat mein Code in der Speichermethode keinen Zugriff auf echte Berichte, da sie noch nicht erstellt wurden.

Verstehst du? Was kann ich tun?

+1

können Sie dafür Django-Signale verwenden. https://docs.djangoproject.com/de/1.10/ref/signals/#post-save –

+0

Ich habe versucht, nichts geändert –

+0

Es gibt einen anderen Weg. Nach dem Speichern Ihres Automodells können Sie die Bewertung aktualisieren. –

Antwort

1

Das Problem hier ist die Reihenfolge der Speicherung in Django.

Ein similar question wurde bereits gefragt und beantwortet.

Sie können das save_formset für Ihre Admin-Site einfach überschreiben, wie im Link angezeigt.

0

Umkehren Sie die Reihenfolge mit ModelAdmin Anrufe save_model() und save_related(). Auf diese Weise können Sie von Model.save() die aktualisierten Werte der zugehörigen Felder erreichen, wie angegeben in this post.

Jetzt gibt self.car_info.all() die aktualisierten Daten zurück.

Verwandte Themen