如何在python django中获取所有父节点但过滤子节点

Posted

技术标签:

【中文标题】如何在python django中获取所有父节点但过滤子节点【英文标题】:How to get all parent nodes but filter child node in python django 【发布时间】:2021-10-04 05:04:31 【问题描述】:

我正在尝试使用 Django(3.2) 中的过滤子模型获取所有父级的记录。

class Parent(models.Modal):
    name = models.CharField(max_length=20)

class Child(models.Modal):
    parent = models.ForeignKey(Parent, related_name="children", 
                               on_delete=models.CASCADE)
    name = models.CharField(max_length=20)
    is_working = models.BooleanField(default=True)
    level = models.CharField(max_length=1, choices=[(1, 1), 
                             (2, 2), (3, 3), (4, 4), (5, 5)])

就像这些模型一样,我想让所有父母都没有工作的孩子。 我正在尝试这样Parent.objects.filter(children__is_working=False)。但是让那些具有 is_working False 值的父母。如果一位父母有多个孩子 种类的记录,所以父查询集也返回那些父母。 我的要求是让所有父母都拥有 is_working 值为 False 的孩子。

【问题讨论】:

【参考方案1】:

我认为你希望那些孩子的父母没有 is_working True 所以使用排除而不是过滤:

Parent.objects.exclude(children__is_working=True)

【讨论】:

感谢您。但是如果我要查询一个字符串字段怎么办。然后我们如何排除或过滤孩子。就像在儿童模型中有另一个提交level = models.CharField(max_length=1, choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)]) 然后如何让 1 级儿童成为父模型。 Parent.objects.exclude(children__level=1) 我认为Parent.objects.exclude(children__level__in=[2,3,4]) 按预期工作 它不起作用。我正在做level = [i['level'] for i in Child.objects.exclude(level=1).values('level').annotate().order_by()] Parent.objects.exclude(children__level__in=level) ,但没有获得 1 级记录

以上是关于如何在python django中获取所有父节点但过滤子节点的主要内容,如果未能解决你的问题,请参考以下文章

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

如何获取通用java树中所有祖先的列表

怎么让所有子节点被选中,父节点自动选中 TreeView

wpf中选中treeview的某个子节点后获取子节点所在的所有父节点的内容用于数据库查询

使用 SAX 解析器时如何获取父节点?

遍历 YAML::Node 时如何获取当前节点的父节点?