【发布时间】:2019-10-29 21:00:20
【问题描述】:
我遇到了一些独特的问题,想看看哪种解决方案适合最佳实践,或者我的设计中是否遗漏了任何东西。
我有一个模型 - 它上面有一个表示指标的字段。该指标是可以来自多个数据库表的对象的外键。
想法一:
多个外键字段。我将受益于级联选项、从MyModel 直接访问外键模型实例(尽管这是一个易于添加的属性)以及相关的查找。陷阱包括需要检查模型上任意数量的字段以查找 FK。另一个是确保在给定时间只有一个 FK 字段具有值的逻辑(易于检查 presave),尽管 .update 存在问题。然后从所有列中在数据库中添加空间,尽管这不太重要。
class MyModel(models.Model):
source_one = models.ForeignKey(
SourceOne,
null=True,
blank=True,
on_delete=models.SET_NULL,
db_index=True
)
source_two = models.ForeignKey(
SourceTwo,
null=True,
blank=True,
on_delete=models.SET_NULL,
db_index=True
)
source_three = models.ForeignKey(
SourceThree,
null=True,
blank=True,
on_delete=models.SET_NULL,
db_index=True
)
想法二:
在模型上存储一个 source_id 和 source。如果源被删除,我对此最大的担忧是需要维护将这些字段设置为 null 的逻辑。否则,它似乎是一个更清洁的解决方案,但不确定确保数据准确的开销是否值得。如有必要,我可能可以在 fk 模型上的删除挂钩中编写一些逻辑来清理 MyModel。
class MyModel(models.Model):
ONE = 1
TWO = 2
THREE = 3
SOURCES = (
(ONE, "SourceOne"),
(TWO, "SourceTwo"),
(THREE, "SourceThree")
)
source_id = models.PositiveIntegerField(null=True, blank=True)
source = models.PositiveIntegerField(null=True, blank=True, choices=SOURCES)
我会喜欢社区的意见。
【问题讨论】:
-
你知道 Django 对generic relations 的内置支持吗?它似乎基本上等同于您的想法 2。
-
@KevinChristopherHenry 看起来是一个很好的解决方案
标签: django django-models django-rest-framework