我的一个模型有以下概念设计。
class A(models.Model):
...
class B(A): #Inherits A
fieldA = ...
fieldB = ...
class C(A): #Inherits A
fieldC = ...
fieldD = ...
class D(models.Model):
field = models.ForeignKey(A) #Here lies the problem, should store B or C
鉴于上述模型,我想将外键存储到 D 中的 B 或 C,但不能同时存储两者。
我尝试将 A 的 Meta 类属性设置为抽象,但这不允许与 A 建立 ForeignKey 关系。我不想要拥有一个不是 B 或 A 的实例C,但如有必要,我可以使用保存信号限制此行为。
是否有更简单的设计可以让我从所有类都继承自公共(public)基类的类型列表中存储外键?
最佳答案
我可以想到两种选择:
使用 generic relation在您的 D
类中而不是外键。
如果您不需要使用 B
或 C
中的特定字段过滤 D
,您可以继续使用您的方法现在有,但是向 D
添加一个方法来检索 field
的子类:
class D(models.Model):
field = models.ForeignKey(A)
def get_field(self):
try:
return self.field.b
except B.DoesNotExist:
pass
try:
return self.field.c
except C.DoesNotExist:
pass
这肯定会影响性能,正如您在帖子中所说,您必须手动确保 A
的每个实例都有 B
或 C
子类。显然,如果您要拥有 n
个子类,则这种方法无法很好地扩展。
https://stackoverflow.com/questions/13074147/