Django-获取外键对象列表

2024-05-14 04:25:54 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下模型:

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)

但是,这将返回子模型ID的列表,而不是完整的对象。是否有一个queryset函数可以完成我正在尝试的操作,或者我需要使用返回的id编写一个附加的筛选查询?一、 e.-代替:

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

我想要:

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

Tags: name模型child过滤器列表modelobjectmodels
3条回答

可以将子查询与__in一起使用:

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

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

我认为您可能需要重构您的模型,使其类似于:

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

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

然后,您可以执行以下操作来接收ChildModel的queryset列表:

ParentModel.childmodel_set.all()

这将被解释为“每个父模型可以有许多子模型”

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

你有两个选择:

  1. 编写自己的queryset子类
  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)

相关问题 更多 >