模型“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对象的列表。
答案 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()