1

私はdjango-relationshipsを使用しており、次のようにフォロワー数でユーザーをフィルタリングしています:

Relationship.objects.values('to_user').annotate(num_followers=Count('to_user')).order_by('-num_followers')

このようなものを返します

[{'to_user': 1, 'num_followers': 3}, {'to_user': 4, 'num_followers': 1}]

私の問題は、自分の User オブジェクトだけでなく、自分の User オブジェクトにアクセスする必要があることですpk。今、私は次のようなことをしています:

tu_list = []
for tu in top_users_set:
    tu_list.append({
        'top_user': User.objects.get(pk=tu['to_user']),
        'followers': tu['num_followers'],
    })

すべてのユーザーに対してクエリを実行しています。クエリセットには何百人ものユーザーがいる可能性があるため、これは非常に悪いことです。

これを改善するための情報をいただければ幸いです。

ありがとう

4

1 に答える 1

1

ユーザーが必要な場合は、ユーザー モデルをクエリしてリレーションシップに参加することで、逆の方法でユーザーにアクセスする必要があります。関連ドキュメントはこちら

次のようになります。

from django.db.models import Count

users = User.objects.annotate(num_followers=Count('to_users')).order_by('-num_followers')

これによりユーザーが得られ、それぞれに追加のプロパティnum_followersがあります

model.py

from django.contrib.auth.models import User
from django.db import models

class Relationship(models.Model):
    from_user = models.ForeignKey(User, related_name='from_users')
    to_user = models.ForeignKey(User, related_name='to_users')

テスト

>>> from so.models import *
>>> from django.contrib.auth.models import User
>>> u1 = User()
>>> u1.username='user1'
>>> u1.save()
>>> u2 = User()
>>> u2.username='user2'
>>> u2.save()
>>> u3=User()
>>> u3.username='user3'
>>> u3.save()
>>> # so we have 3 users now
>>> r1 = Relationship()
>>> r1.from_user=u1
>>> r1.to_user=u2
>>> r1.save()
>>> r2=Relationship()
>>> r2.from_user=u1
>>> r2.to_user=u3
>>> r2.save()
>>> r3=Relationship()
>>> r3.from_user=u2
>>> r3.to_user=u3
>>> r3.save()
>>> rels = Relationship.objects.all()
>>> rels.count()
3
>>> # we have 3 relationships: user1 follows user2, user1 follows user3, user2 follows user3
>>> users = User.objects.annotate(num_followers=Count('to_users')).order_by('-num_followers')
>>> for user in users:
>>>     print user.username, user.num_followers
user3 2
user2 1
user1 0

EDIT2はタイプミスを修正し、テストを追加しました

于 2012-06-21T15:11:39.563 に答える