繁体   English   中英

django 查询集过滤相关字段是否为空

[英]django queryset filter on whether related field is empty

这是我的模型:

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))

无需计算您不使用的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM