【问题标题】:How to get all parent nodes but filter child node in python django如何在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 的孩子。

【问题讨论】:

    标签: python django django-queryset django-filter


    【解决方案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 级记录
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    相关资源
    最近更新 更多