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-获取外键对象列表的主要内容,如果未能解决你的问题,请参考以下文章