Django 通用一对一关系及级联删除
我正在尝试用 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