假设我有:
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()方法时,请在Album
类上递增photo_count
,因此我想覆盖.add()方法。问题是,我无法导入.add()
的类,因为它在方法内部,因此就像def->class->def
一样。那么是否有覆盖.add()
?还是有更好的方法?
您可以使用django的信号并编写一个信号处理程序,该信号处理程序将使用m2m_changed
信号递增计数器:
https://docs.djangoproject.com/en/dev/ref/signals/#m2m-changed
可能最简单的选项是跳过信号,完全删除photo_count字段,然后调用[permains.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')
这两个选项的缺点是它们使基于照片数量的搜索/排序更加困难。他们也不会将计数存储在数据库中。(如果您有一些与同一DB进行交互的非Django应用程序,则可能是导入的。)如果您认为您想通过Django进行此类搜索,请查看Django注释。
这比处理信号要简单,但可能仍然过度杀伤。