【问题标题】:django queryset filter on whether related field is emptydjango queryset过滤器关于相关字段是否为空
【发布时间】:2022-12-10 18:19:09
【问题描述】:

这是我的模型:

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() 拒绝列表视图的空标志以提高性能和优雅度。

【问题讨论】:

    标签: python django foreign-keys many-to-many django-queryset


    【解决方案1】:

    您可以计算每个 Ban 实例中的标志实例,对其进行注释,然后通过此注释进行归档,类似于:

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

    【讨论】:

      猜你喜欢
      • 2016-01-15
      • 1970-01-01
      • 2013-07-30
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 2022-06-17
      • 1970-01-01
      相关资源
      最近更新 更多