2

对于我的一个模型,我有以下概念设计。

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 类属性设置为抽象,但这不允许 ForeignKey 与 A 的关系。我希望有一个不是 B 或 C 的 A 实例,但如有必要,我可以限制这一点保存信号的行为。

是否有更简单的设计可以让我从所有类都继承自公共基础的类型列表中存储外键?

4

1 回答 1

1

我可以想到两个选择:

  1. 在您的类中使用通用关系D而不是外键。

  2. 如果您不需要D使用特定字段进行过滤,B或者C您可以继续使用现在的方法,但添加一个方法来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都有一个BC子类。显然,如果您要拥有n多个子类,这种方法就不能很好地扩展。

于 2012-10-25T17:52:03.653 回答