如何将两个模型与一个通用模型相关联?

时间:2016-09-11 19:41:04

标签: django

模型“A”是通用模型,意味着任何模型都可以与之相关。模型“B”和“C”是想要与模型“A”建立外键关系的模型。怎么办呢?

class A(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

    list = # What goes here?

class B(models.Model):
    parent = # What goes here to refer to model A?
    name = models.CharField(max_length=255)
    age = models.IntegerField()

class C(models.Model):
    parent = # What goes here to refer to model A?
    title = models.CharField(max_length=255)
    body = models.TextField()

示例查找将是:

A.list.all()

给我一​​个B对象或C对象的列表。

2 个答案:

答案 0 :(得分:0)

这完全是你要求的错误设计。您的结构只允许一个项目与每个A相关,无论是B还是C。

相反,你需要一个中间模型,它包含GenericForeignKey,并且还有一个(正常)ForeignKey到A.这就是标记应用程序的工作方式:例如参见django-tagging' s TaggedItem model。 / p>

答案 1 :(得分:0)

我决定使用不同的相关名称,这些名称适用于我的情况:

class A(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

class B(models.Model):
    parent = models.ForeignKey('A', related_name='B')
    name = models.CharField(max_length=255)
    age = models.IntegerField()

class C(models.Model):
    parent = models.ForeignKey('A', related_name='C')
    title = models.CharField(max_length=255)
    body = models.TextField()