根据Django中的children_set计数进行过滤

时间:2014-10-31 10:15:33

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

我是一个孩子设为

的过滤器
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)

1 个答案:

答案 0 :(得分:0)

ParentModel.objects.exclude(childrenmodel_set__isnull=True)