Django-获取外键对象列表

Posted

技术标签:

【中文标题】Django-获取外键对象列表【英文标题】:Django- getting a list of foreign key objects 【发布时间】:2017-12-17 03:37:02 【问题描述】:

假设我有以下模型:

class ParentModel(models.Model):
    name = models.CharField()
    child = models.ForeignKey("ChildModel")

class ChildModel(models.Model):
    name = models.CharField()

现在,给定 ParentModels 上的一些过滤器,我想检索所有子模型的列表。我试过了:

children = ParentModel.objects.filter(name__startswith='A').values_list('child', flat=True)

但是,这会返回 ChildModel id 的列表,而不是完整的对象。是否有一个查询集函数可以完成我正在尝试做的事情,或者我是否需要使用返回的 id 编写一个额外的过滤器查询?即 - 而不是:

children => [51L, 53L, 54L]

我想要:

children => [<ChildModel: ChildModel Object>, <ChildModel: ChildModel Object>, <ChildModel: ChildModel Object>]

【问题讨论】:

你能说明“ParentModels 上的一些过滤器”是什么意思吗?什么样的过滤器? 当然,它可能类似于ParentModel.objects.filter(name__startswith='A') 来检索名称以“A”开头的所有父母(然后获取这些父母的所有子模型) 【参考方案1】:

您可以使用带有__in 的子查询:

Child.objects.filter(parent__in=Parent.objects.filter(name__startswith='A'))

(注意,您的命名在这里有点奇怪:通常孩子是具有外键的那个,因为它假定父母可以有多个孩子。)

【讨论】:

是的,我意识到我的命名有点倒退。试图采用一组更复杂的外键关系并将其简化为问题的根源。谢谢! 这不会保留内部查询集的顺序!【参考方案2】:

这是 Django 网站上的一个活跃问题: https://code.djangoproject.com/ticket/8144

你有两个选择:

    编写自己的查询集子类 添加另一个过滤器以获取您检索到的 id 的对象

我知道如何实现选项 2,所以这是我的方法:

选项 #2:

children_ids = ParentModel.objects.filter(name__startswith='A').values_list('child', flat=True)
children = ChildModel.objects.filter(pk__in=children_ids)

【讨论】:

【参考方案3】:

我认为您可能希望将模型重构为:

class ParentModel(models.Model):
    name = models.CharField()

class ChildModel(models.Model):
    name = models.CharField()
    parent = models.ForeignKey(ParentModel)

然后您可以执行以下操作来接收ChildModel 的查询集列表:

ParentModel.childmodel_set.all()

这将被解释为“每个 ParentModel 可以有多个 ChildModel”。

【讨论】:

以上是关于Django-获取外键对象列表的主要内容,如果未能解决你的问题,请参考以下文章

Django - 有啥方法可以立即获取外键对象?

Django在Queryset中获取外键对象

如何通过django中的多级反向外键获取相关对象查询集?

从 Django values() 获取外键值

Django获取外键整个对象而不仅仅是id(主键)

如何获取Django中子模型中存在外键的父模型的所有对象?