Python 带有过滤器(多对多)跟随器/下表的Django条件注释计数

Python 带有过滤器(多对多)跟随器/下表的Django条件注释计数,python,django,annotations,conditional,Python,Django,Annotations,Conditional,这对我来说有点让人心烦意乱,所以我决定寻求一些帮助 我所拥有的是一个标准用户模型和一个跟踪用户是否相互跟随的表格,其中有一个from_user,to_user,以及后面的值。第一个是用户表的外键,第三个是布尔值 我想做的是能够覆盖django admin中的默认get_queryset方法,这样我就可以根据用户拥有的追随者数量进行排序 我目前所做的是标注关注者的数量,这可能是我遗漏的一些小东西,但下面是我的代码: def get_queryset(self, request): retu

这对我来说有点让人心烦意乱,所以我决定寻求一些帮助

我所拥有的是一个标准用户模型和一个跟踪用户是否相互跟随的表格,其中有一个
from_user
to_user
,以及
后面的
值。第一个是用户表的外键,第三个是布尔值

我想做的是能够覆盖django admin中的默认
get_queryset
方法,这样我就可以根据用户拥有的追随者数量进行排序

我目前所做的是标注关注者的数量,这可能是我遗漏的一些小东西,但下面是我的代码:

def get_queryset(self, request):
    return AuthUser.objects.annotate(
        followers_count=Sum(
            Case(
                When(user_relations__from_user=1, user_relations__to_relation__following=True, then=1),
                default=0,
                output_field=IntegerField()
            )
        ))
错误的部分-我一直在使用
user\u relations\u\u from\u user=1
,它应该是当前被评估用户的id

在聚合所有条目时,我需要做的是我已经在用户模型中的单个案例场景中做的事情:

@property
def num_followers(self):
    return UserRelations.objects.filter(from_user=self, following=True).count()
这似乎很简单,但在注释时如何从_user=self获得

编辑:尝试使用F
user\u relations\uu from\u user\u id\uu pk=F('id')

另一个注释-my
from_user
to_user
fk字段实际上被命名为
from_user\u id
to_user\u id
-希望这不会导致额外的混淆。很抱歉

Internal Server Error: /admin/pkm_user/authuser/
Traceback (most recent call last):
  File "/home/bastor/Work/pokemall-api/env/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 132, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/bastor/Work/pokemall-api/env/local/lib/python2.7/site-packages/django/contrib/admin/options.py", line 616, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
  File "/home/bastor/Work/pokemall-api/env/local/lib/python2.7/site-packages/django/utils/decorators.py", line 110, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/home/bastor/Work/pokemall-api/env/local/lib/python2.7/site-packages/django/views/decorators/cache.py", line 57, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "/home/bastor/Work/pokemall-api/env/local/lib/python2.7/site-packages/django/contrib/admin/sites.py", line 233, in inner
    return view(request, *args, **kwargs)
  File "/home/bastor/Work/pokemall-api/env/local/lib/python2.7/site-packages/django/utils/decorators.py", line 34, in _wrapper
    return bound_func(*args, **kwargs)
  File "/home/bastor/Work/pokemall-api/env/local/lib/python2.7/site-packages/django/utils/decorators.py", line 110, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/home/bastor/Work/pokemall-api/env/local/lib/python2.7/site-packages/django/utils/decorators.py", line 30, in bound_func
    return func.__get__(self, type(self))(*args2, **kwargs2)
  File "/home/bastor/Work/pokemall-api/env/local/lib/python2.7/site-packages/django/contrib/admin/options.py", line 1548, in changelist_view
    self.list_max_show_all, self.list_editable, self)
  File "/home/bastor/Work/pokemall-api/env/local/lib/python2.7/site-packages/django/contrib/admin/views/main.py", line 47, in __init__
    self.root_queryset = model_admin.get_queryset(request)
  File "/home/bastor/Work/pokemall-api/django/pkm_user/admin.py", line 65, in get_queryset
    output_field=IntegerField()
  File "/home/bastor/Work/pokemall-api/env/local/lib/python2.7/site-packages/django/db/models/query.py", line 794, in annotate
    obj.query.add_annotation(annotation, alias, is_summary=False)
  File "/home/bastor/Work/pokemall-api/env/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 977, in add_annotation
    summarize=is_summary)
  File "/home/bastor/Work/pokemall-api/env/local/lib/python2.7/site-packages/django/db/models/aggregates.py", line 20, in resolve_expression
    c = super(Aggregate, self).resolve_expression(query, allow_joins, reuse, summarize)
  File "/home/bastor/Work/pokemall-api/env/local/lib/python2.7/site-packages/django/db/models/expressions.py", line 491, in resolve_expression
    c.source_expressions[pos] = arg.resolve_expression(query, allow_joins, reuse, summarize, for_save)
  File "/home/bastor/Work/pokemall-api/env/local/lib/python2.7/site-packages/django/db/models/expressions.py", line 779, in resolve_expression
    c.cases[pos] = case.resolve_expression(query, allow_joins, reuse, summarize, for_save)
  File "/home/bastor/Work/pokemall-api/env/local/lib/python2.7/site-packages/django/db/models/expressions.py", line 713, in resolve_expression
    c.condition = c.condition.resolve_expression(query, allow_joins, reuse, summarize, False)
  File "/home/bastor/Work/pokemall-api/env/local/lib/python2.7/site-packages/django/db/models/query_utils.py", line 91, in resolve_expression
    clause, joins = query._add_q(self, reuse, allow_joins=allow_joins, split_subq=False)
  File "/home/bastor/Work/pokemall-api/env/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1332, in _add_q
    allow_joins=allow_joins, split_subq=split_subq,
  File "/home/bastor/Work/pokemall-api/env/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1194, in build_filter
    lookups, value)
  File "/home/bastor/Work/pokemall-api/env/local/lib/python2.7/site-packages/django/db/models/fields/related.py", line 1709, in get_lookup_constraint
    raise exceptions.FieldError('Relation fields do not support nested lookups')
FieldError: Relation fields do not support nested lookups

我想你在寻找:


你好感谢您的快速回复和F信息!它真的很震撼,是一个很好的了解类型的事情。在使用您描述的
关系字段时,由于某些原因,我似乎遇到了一个
关系字段不支持嵌套查找的错误。Hmmm。你能把这个错误的堆栈跟踪作为你的问题的编辑吗?我已经根据你对模型结构的反馈编辑了答案-希望这是正确的。哦,我的天,多尴尬啊。我搞砸了关系应该是用户关系从用户到关系从用户id=F('id')忘记了到关系现在没有给出任何错误,但注释似乎不正确。好像那种是错的。不过,我会多玩玩F()。也许我还缺少一些相当明显的东西。非常感谢你的帮助!:)现在看起来根本不像是在排序?您应该能够添加order_by子句来对结果进行排序。假设这就是你所说的排序。
from django.db.models import F

def get_queryset(self, request):
    return AuthUser.objects.annotate(
        followers_count=Sum(
            Case(
                When(user_relations__to_relation__from_user__id=F('id'),
                     user_relations__to_relation__following=True, then=1),
                default=0,
                output_field=IntegerField()
            )
        ))