Django 通用外键和 select_related

Posted

技术标签:

【中文标题】Django 通用外键和 select_related【英文标题】:Django generic foreign key and select_related 【发布时间】:2010-09-24 19:07:47 【问题描述】:

我正在尝试使用具有通用外键的关系来选择模型,但它没有按预期工作。

我认为用代码更好地说明和理解

class ModelA(models.Model):
 created = models.DateTimeField(auto_now_add=True)

class ModelB(models.Model):
 instanceA = models.ForeignKey(ModelA)

 content_type = models.ForeignKey(ContentType)
 object_id = models.PositiveIntegerField()
 content_object = generic.GenericForeignKey()

class ModelC(models.Model):
 number = models.PositiveIntegerField()
 bInstances = generic.GenericRelation(ModelB)

# Creating an instance of A and C
aInstance=ModelA.objects.create()
cInstance=ModelC.objects.create(number=3)

# Adding instance of C to the B_set of instance A
aInstance.modelb_set.add(content_object=cInstance)

# Select all ModelA instances that have C as content object? Does not work
whatIWant = ModelA.objects.filter(modelb__content_object=modelCInstance)

# Pseudo-solution, requires calling whatIWant.modelA
whatIWant = cInstance.bInstances.select_related("modelA") 

为了清楚起见,我希望这条线有效:ModelA.objects.filter(modelb__content_object=modelCInstance),显然 django 不支持在过滤器关系上使用 content_object。

提前致谢!

【问题讨论】:

你期待什么?如果没有问题,我们无法回答。 我已经编辑了帖子以使其更清晰,对不起 【参考方案1】:

看看http://www.djangoproject.com/documentation/models/generic_relations/。 并尝试:

ctype = ContentType.objects.get_for_model(modelCInstance)
what_you_want = ModelA.objects.filter(modelb__content_type__pk=ctype.id, 
                                      modelb__object_id=modelCInstance.pk)

请查看一些 django coding/naming conventions,以使您的代码更易于阅读和理解!

【讨论】:

感谢您的提示!这是唯一的方法吗?我正在寻找更友好的东西,无论如何谢谢! 由于 ContentTypes 等不是 django 核心的一部分,内置的 filter 不知道如何处理此类查询,因此您必须自己过滤 content_type 和 object_id!

以上是关于Django 通用外键和 select_related的主要内容,如果未能解决你的问题,请参考以下文章

Django中ORM外键和表的关系(Django编程-4)

Django REST框架外键和过滤

django模板中的两个外键和一个值

具有外键和多对多关系的 Django 模型与同一模型

如何在Django中加入非主键和外键列的查询

django-外键和表关系