Django Queryset:检查父模型是否具有子/引用模型

时间:2013-07-17 10:30:56

标签: python django

型号:

class Parent(models.Model)
  name = models.CharField(max_length=20L)

class Child(models.Model)
  parent_id = models.ForeignKey('Parent')
  name = models.CharField(max_length=20L)

如何获取有孩子的父母列表?

我现在的解决方案是迭代Parent-queryset,然后检查它是否有子节点。关于这个查询是否有任何干净的解决方案?

谢谢你们!

3 个答案:

答案 0 :(得分:3)

parentList = Child.objects.filter(parent_id__isnull=False).values_list('parent_id', flat=True)

parentList = list(set(parentList))

将set设置为仅获取Parent一次

答案 1 :(得分:3)

这对我有用。

parents_id_that_have_childs = Child.objects.filter(parent_id__isnull=False).values_list('parent_id', flat=True)

parents = Parent.objects.filter(id__in=list(set(parents_id_that_have_childs)))

让我解释一下:

在parents_id_that_have_childs中,您将拥有父母的独特ID列表,显然,这些父母有子女obj。

然后你只需过滤那些有这些ID的父母。

parents = Parent.objects.filter(id__in = list(set(parents_id_that_have_childs)))

答案 2 :(得分:0)

你真的应该看看django-mptt。

但关于你的问题:

parents_with_child = Parent.objects.exclude(child_set=None)