Django 通用一对一关系及级联删除

4 投票
1 回答
1325 浏览
提问于 2025-04-17 03:20

我正在尝试用 Django 的 通用关系 来模拟一个继承模型。到目前为止,我得到了这样的结果:

class Base(models.Model):
  content_type = models.ForeignKey(ContentType)
  object_id = models.PositiveIntegerField()
  content_object = generic.GenericForeignKey()
  ... other stuff

  class Meta:
    unique_together = ("content_type", "object_id")

class SubClass1(models.Model):
  ... properties for this class

  _base = generic.GenericRelation(Base)

  @property
  def base(self):
    return self._base.all()[0]

从这里你可以看到,SubClass1 应该和 Base 有一对一的关系,这就是我为什么要创建那个 _base 字段,然后用 base 属性来覆盖它。这样设置通用关系可以自动处理级联删除,这正是我想要的(而且我还有一个 post-delete 信号,可以从另一个方向处理删除)。

Base 可以派生出任意数量的子类,而让我觉得不舒服的是不得不复制粘贴 _base 及其覆盖属性。我还有一个与此相关的自定义对象管理器,可能还有其他一些东西,它们在每个 Base 的子类中都应该表现得一样。

有没有好的方法来封装这些共同的功能,这样我就不需要为每个子类复制粘贴了?

1 个回答

2

为什么不创建一个叫做BaseSubClass的基础类,然后从这个基础类继承呢?根据你的例子:

class BaseSubClass(models.Model):
    _base = generic.GenericRelation(Base)

    class Meta:
        abstract = True

    @property
    def base(self):
      return self._base.all()[0]

class SubClass1(BaseSubClass):
    # fields

撰写回答