【问题标题】:django manytomanyfield .add() methoddjango manytomanyfield .add() 方法
【发布时间】:2012-11-10 10:54:45
【问题描述】:

假设我有:

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

【问题讨论】:

    标签: python django overriding manytomanyfield


    【解决方案1】:

    can use django's signals 并编写一个信号处理程序,该处理程序将使用 m2m_changed 信号递增计数器:

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

    【讨论】:

      【解决方案2】:

      可能最简单的选择是跳过信号,完全删除 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

      这比处理信号更简单,但可能还是有点矫枉过正。

      【讨论】:

        猜你喜欢
        • 2020-11-20
        • 2021-08-29
        • 2014-05-22
        • 2012-01-12
        • 2011-12-24
        • 2013-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多