6

假设我有:

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_countonAlbum类,所以我想覆盖 .add() 方法。问题是,我无法导入.add()'s 类,因为它在方法内,所以它就像def->class->def. 那么有什么可以覆盖的.add()吗?或者有更好的方法来做到这一点?

4

2 回答 2

7

可以使用 django 的信号并编写一个信号处理程序,该处理程序将使用信号递增计数器m2m_changed

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

于 2012-11-10T11:07:30.160 回答
0

可能最简单的选择是跳过信号,完全删除 photo_count 字段,然后在您使用 [album].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')

这两个选项的缺点是它们使根据照片数量进行搜索/排序变得更加困难。他们也不将计数存储在数据库中。(如果您有一些与同一个数据库交互的非 Django 应用程序,这可能是重要的。)如果您认为您想通过 Django 进行此类搜索,请查看Django annotations

这比处理信号更简单,但可能仍然是矫枉过正。

于 2014-11-12T23:01:03.810 回答