Django ORM 的模型继承方法

4 投票
2 回答
2545 浏览
提问于 2025-04-15 14:05

我想在我正在玩弄的一个网页应用中存储事件,但我对使用继承的方式有点犹豫,不知道该用得多还是少。

举个例子:

class Event(models.Model):
    moment = models.DateTimeField()

class UserEvent(Event):
    user = models.ForeignKey(User)
    class Meta:
        abstract = True

class UserRegistrationEvent(UserEvent):
    pass # Nothing to add really, the name of the class indicates it's type

class UserCancellationEvent(UserEvent):
    reason = models.CharField()

感觉我在疯狂创建数据库表。这会需要很多连接操作来选择数据,可能会让查询变得复杂。不过,这样的设计我觉得还不错。

那用一个“更简单”的模型,只加更多字段,会不会更合理呢?

class Event(models.Model):
    moment = models.DateTimeField()
    user = models.ForeignKey(User, blank=True, null=True)
    type = models.CharField() # 'Registration', 'Cancellation' ...
    reason = models.CharField(blank=True, null=True)

谢谢大家对此的评论。

菲利普

2 个回答

2

你可以试试抽象基类模型。这个方法可以实现继承,但不需要使用连接(joins),只为子类创建表,这些表里包含了父类和子类的字段。这样,你就可以保持你想要的嵌套设计,同时避免因为连接而带来的性能问题。

6

扁平结构比嵌套结构更好。我觉得在这种情况下,“深层继承”并没有给你带来什么好处:我更倾向于选择扁平的结构,因为它设计得更简单、更直接,可能在性能上也更好,而且更容易访问。

撰写回答