Django ORM 的模型继承方法
我想在我正在玩弄的一个网页应用中存储事件,但我对使用继承的方式有点犹豫,不知道该用得多还是少。
举个例子:
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
扁平结构比嵌套结构更好。我觉得在这种情况下,“深层继承”并没有给你带来什么好处:我更倾向于选择扁平的结构,因为它设计得更简单、更直接,可能在性能上也更好,而且更容易访问。