Django manytomanyfield .add () Methode

Angenommen, ich habe:

class Album(models.Model): photos = models.ManyToManyField('myapp.Photo') photo_count = models.IntegerField(default = 0) class Photo(models.Model): photo = models.ImageField(upload_to = 'blahblah') 

Was ist Wille ist, jedes Mal, wenn ich rufe .add () -Methode, inkrementiere die photo_count auf Album Klasse, so dass ich denke, zu override .add () -Methode. Das Problem ist, ich kann nicht importieren die .add() 's Klasse, da es in einer Methode ist, also ist es wie def->class->def . So ist es sowieso zu überschreiben.add .add() ? Oder gibt es einen besseren Weg, dies zu tun?

    2 Solutions collect form web for “Django manytomanyfield .add () Methode”

    Sie können die Signale von Djangos verwenden und einen Signalhandler schreiben, der den Zähler mit dem m2m_changed Signal inkrementiert:

    https://docs.djangoproject.com/de/dev/ref/signals/#m2m-changed

    Wahrscheinlich ist die einfachste Möglichkeit, Signale zu überspringen, das Foto_count-Feld vollständig zu löschen und [Album] .photos.count () anzurufen, wo Du das [Album] .photo_count benutzt hättest.

    Sie können auch eine Eigenschaft auf Album wie folgt definieren:

     class Album(models.Model): photos = models.ManyToManyField('myapp.Photo') @property def photo_count(self): return self.photos.count() class Photo(models.Model): photo = models.ImageField(upload_to = 'blahblah') 

    Der Nachteil beider Optionen ist es macht es schwieriger zu suchen / sortieren, basierend auf der Anzahl der Fotos. Sie speichern auch nicht die Zählung in der Datenbank. (Das könnte importieren, wenn Sie einige Nicht-Django-Anwendung haben, die mit demselben DB interagiert.) Wenn Sie denken, dass Sie diese Art von Suchvorgängen über Django machen möchten, schauen Sie in Django-Annotationen .

    Das ist einfacher als der Umgang mit Signalen, aber wahrscheinlich noch übertrieben.

    Python ist die beste Programmiersprache der Welt.