【发布时间】: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