Метод django manytomanyfield .add ()

Предположим, что у меня есть:

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

То, что нужно, каждый раз, когда я вызываю метод .add (), увеличивает значение photo_count на классе Album , поэтому я думаю переопределить метод .add (). Проблема в том, что я не могу импортировать .add() , поскольку он находится внутри метода, поэтому он похож на def->class->def . Так или иначе, чтобы переопределить .add() ? Или есть лучший способ сделать это?

Вы можете использовать сигналы django и написать обработчик сигнала, который будет увеличивать счетчик с m2m_changed сигнала m2m_changed :

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

Вероятно, самым простым вариантом является пропустить сигналы, полностью отбросить поле photo_count и вызвать [album] .photos.count () в любом месте, которое вы использовали бы [album] .photo_count.

Вы также можете определить свойство в альбоме следующим образом:

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

Недостатком обоих вариантов является то, что они затрудняют поиск / сортировку в зависимости от количества фотографий. Они также не хранят счет в базе данных. (Это может быть импорт, если у вас есть приложение, отличное от Django, которое взаимодействует с одним и тем же БД.) Если вы считаете, что захотите выполнить эти виды поиска через Django, просмотрите аннотации Django .

Это проще, чем иметь дело с сигналами, но, вероятно, все еще переборщить.