【问题标题】:Filter based on children_set count in Django根据 Django 中的 children_set 计数进行过滤
【发布时间】:2014-10-31 10:15:33
【问题描述】:

我正在过滤一个孩子设置为

ParentModel.objects.all().prefetch_related(
    Prefetch(
        lookup='childrenmodel_set',
        queryset=ChildrenModel.objects.exclude(is_active=False)
    )
)

现在每个 ParentModel 对象都可以有一个 childrenmodel_set 但其中一些查询集是空的。

如何排除那些没有子对象的ParentModel 对象?

我想到了:

ParentModel.objects.all().prefetch_related(
    Prefetch(
        lookup='childrenmodel_set',
        queryset=ChildrenModel.objects.exclude(is_active=False)
    )
).exclude(childrenmodel_set=None)

ParentModel.objects.all().prefetch_related(
    Prefetch(
        lookup='childrenmodel_set',
        queryset=ChildrenModel.objects.exclude(is_active=False)
    ).aggregate(num_objects=Count(id))
).exclude(num_objects=0)

ParentModel.objects.all().prefetch_related(
    Prefetch(
        lookup='childrenmodel_set',
        queryset=ChildrenModel.objects.exclude(is_active=False)
    )
).annotate(childrenset_size=Count(childrenset)).exclude(childrenset_size=0)

我当然可以在模板中检查这一点,但我想在数据库级别进行。

编辑:

现在我的代码是

self.model.objects.prefetch_related(
    Prefetch(
        lookup='periods',
        queryset=Period.objects.exclude(is_active=False)
    )
).exclude(periods__isnull=True)

它会删除那些没有句点的对象。但是如果一个对象只有非活动周期,它仍然在查询集中表示。如何让exclude 考虑预取?

编辑 2

我的模型

class Article:
    name = CharField(max_length=100)

class Period:
    article = ForeignKey(Article)
    is_active = BooleanField(default=True)

【问题讨论】:

    标签: django django-models django-templates django-views


    【解决方案1】:
    ParentModel.objects.exclude(childrenmodel_set__isnull=True)
    

    【讨论】:

    • 感谢您的回答。可以按我的需要工作了。我已经改变了我的问题。
    • 你能发布你的模型吗?
    • self.model.objects.exclude(periods__isnull=True, periods__is_active=False)self.model.objects.exclude(periods__isnull=True).filter(periods__is_active=True) 并首先使用“调试工具栏”并检查查询数量及其内容,然后如果您有很多查询,请使用 select_related 用于 FK,@987654326 @if many_to_many
    • 但是不要用,写代码的时候只是优化,第二步
    猜你喜欢
    • 2018-03-14
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 2015-02-26
    • 2020-12-15
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    相关资源
    最近更新 更多