django queryset filter关于相关字段是否为空



以下是我的模型:

class Flag(models.Model):
ban = models.ForeignKey('flags.Ban', on_delete=models.CASCADE, related_name='flags')

class Ban(models.Model):
punished = models.BooleanField(default=None)

Flag在用户报告某些内容时触发。并将其汇总到一个Ban实例中,供管理员验证。简单地说,一个禁令可以有多个标志。

有一种情况,作者被举报,在管理员到达之前手动删除他/她发送的内容。这项禁令应该被解除。因此。在禁止列表视图中,我尝试过滤它们并删除。

to_deletes = []
for ban in Ban.objects.all():
if not len(ban.flags.all()):
to_deletes.append(ban)
for ban in to_deletes:
ban.delete()

我想知道是否有一种方法可以将其写入查询集,所有我需要的是一个Ban.objects.all(),拒绝为列表视图的性能和优雅的空标志。

您可以计算每个Ban实例中的标志实例,对其进行注释,然后根据该注释进行过滤,类似于:

from django.db.models import Count
bans_to_delete = Ban.objects.all().annotate(count=Count('flags')).filter(count=0)

如果你只是想检查是否没有标志,你可以使用过滤器

bans_to_delete = (Ban
.objects
.filter(flags__isnull=True))

不用的东西不用数

相关内容

最新更新