1

私は次のモデルを持っています:

class UserProfile(models.Model):
    user = models.OneToOneField(User) 
    score = models.PositiveIntegerField()

class Game(models.Model):
    name = CharField(max_length=100)

class Achievement(models.Model):
    user = models.ForeignKey('User')
    game = models.ForeignKey(Game)

AUTH_PROFILE_MODULEsettings.py で、UserProfile クラスに設定しました。

特定のゲームについて、たとえば、そのゲームで 5 つ以上の成果を上げているユーザーのリストを取得したいと考えています。

だから私がしたことは次のとおりでした:

candidates = Achievement.objects.filter(game=game).values('user').annotate(nba=Count('id')).filter(nba__gte=5).order_by('-user__userprofile__score')

今は動作しますが、問題は、ユーザー ID と彼の nba (実績の数) の値のリストを取得することです。しかし、テンプレートでスコアを印刷し、UserProfile の他の属性にもアクセスする必要があります...

そこで、「.values('user')」を次のように変更してみました。

.values('user','user__userprofile__score')

しかし、うまくいきません!エラーが発生します:

invalid field user__userprofile__score

私が行うとうまくいくことに注意してください:

.values('user','user__username')

属性では値を呼び出すことができるが、外部キーでは呼び出せないことを示しているのはどれですか?

「django-batch-select」アプリケーションを使用して別の方法も試しました:

batch = Batch('achievement_set').filter(game=game)
candidates = User.objects.batch_select(achieved=batch).exclude(achieved__is_null=True)

しかし、私はエラーが発生します:

Cannot resolve keyword 'achieved' into field.

「除外」ステートメントを削除すると機能しますが、このゲームの実績がないユーザーを含むすべてのユーザーのリストを取得します (達成済み == [])

私はどこでも検索してきましたが、問題の解決策が見つかりません...いくつかの助けをいただければ幸いです!

4

2 に答える 2

0

values('user')query_setの最後に削除して追加する必要があるonly('user', 'user__profile')と思いますselect_related('user', 'user__profile')

candidates = [i.user for i in Achievement.objects.\
    select_related('user', 'user__userprofile').\
    annotate(nba=Count('id')).\
    filter(game=game, nba__gte=5).\
    only('user', 'user__userprofile').\
    order_by('-user__userprofile__score')]

私は自分のプロジェクトでこれをテストし、select_relatedそれonlyは機能します

>>> db.connection.queries = []
>>> p = [(i.object, i.object.owner) for i in models.ImageOrVideo.objects.\
      select_related('object', 'object__owner').\
      only('object').all().\
      order_by('-object__owner__id')]
...
>>> len(db.connection.queries)
1
于 2011-06-10T15:06:16.573 に答える
0

1 つの追加クエリでユーザー プロファイルを取得できます。

UserProfile.objects.filter(user_id__in=[x['user'] for x in candidates])
于 2011-06-10T10:29:03.343 に答える