django manytomanyfield .add()方法

时间:2012-11-10 10:54:45

标签: python django override manytomanyfield

假设我有:

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()?或者有更好的方法来做到这一点?

2 个答案:

答案 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

这比处理信号更简单,但可能仍然有点过分。