0

在这种特殊情况下,ModelA 是默认的 Django 模型。用户

ModelB 实现为:

class ModelB(models.Model):
    user = models.ManyToManyField(User)
    #some other stuff

1.对于每条ModelB记录,统计与其没有关系的User记录

我设法使用:

ModelB.objects.all().annotate(user_count=User.objects.count()-Count('user'))

它有效,但感觉就像一个黑客。有没有更好的方法来做到这一点(同时仍在使用annotate())?

2.带过滤

我修改了之前的查询,以使用当前登录的用户进行过滤,这样我就可以为每个用户显示自定义内容。user_count无论登录用户如何,我都打算保持与查询 #1 中相同的值:

ModelB.objects.filter(
    user=request.user
).annotate(
    user_count=User.objects.count()-Count('user')
)

编辑:过滤完成后按预期工作annotate

ModelB.objects.annotate(
    user_count=User.objects.count()-Count('user')
).filter(
    user=request.user
)

仍在寻找比User.objects.count()-Count('user')为每条记录计算非相关用户记录更好的方法ModelB

感谢您的帮助!

4

1 回答 1

0

我不认为你的代码正在做你认为它正在做的事情。Count('user')不返回数据库中的用户总数,而只返回与该ModelB对象相关的用户数。要使用这个解决方案(你自己说 - 是一种非常糟糕的方式来做 IMO),你可能应该使用User.objects.count().

如果我正确理解您的意愿,那么这种方法应该会给您您所寻求的数字:

User.objects.filter(modelb_set__isnull=True).count() # "modelb_set" is the default Django related name, if you've set another one, use that.
# or (depending on which you want)
ModelB.objects.filter(user__isnull=True).count()
于 2016-10-23T14:09:52.820 回答