如何在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中获取所有父节点但过滤子节点的主要内容,如果未能解决你的问题,请参考以下文章