【问题标题】:Django- getting a list of foreign key objectsDjango-获取外键对象列表
【发布时间】: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”开头的所有父母(然后获取这些父母的所有子模型)

标签: python django foreign-keys django-queryset


【解决方案1】:

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

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

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

【讨论】:

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

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

你有两个选择:

  1. 编写自己的查询集子类
  2. 添加另一个过滤器以获取您检索到的 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”。

    【讨论】:

      猜你喜欢
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 2013-01-20
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多