以下是我的模型:
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))
不用的东西不用数