假设我有:
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()
?或者有更好的方法来做到这一点?
答案 0 :(得分:7)
您can use django's signals并编写一个信号处理程序,使用m2m_changed
信号递增计数器:
https://docs.djangoproject.com/en/dev/ref/signals/#m2m-changed
答案 1 :(得分:0)
最简单的选择可能是跳过信号,完全放下photo_count字段,并在[专辑] .photo_count。
使用的任何地方调用[album] .photos.count()。您还可以在Album上定义属性,如下所示:
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')
这两个选项的缺点是它们使得根据照片数量进行搜索/排序变得更加困难。他们也不会将计数存储在数据库中。 (如果您有一些与同一个DB交互的非Django应用程序,那么这可能是重要的。)如果您认为您希望通过Django进行这类搜索,请查看Django annotations。
这比处理信号更简单,但可能仍然有点过分。