1

私は2つのDjangoモデルを持っています。

アクティビティを保存するもの:

Activity:
    -title #Exampe: sky diving
    -category
    -etc...


そして、ユーザーとそのアクティビティとのやり取りを保存するもの (例: 誰かがそれを行った場合)。レコードは、ユーザー インタラクションが発生した場合にのみ挿入されます。

UserActivity:
    -user (Foreign key to user model) #Exampe: sky diving
    -activity (Foreign key to Activity model)
    -is_completed (boolean)


今、現在のユーザーがすでに完了したものを除いて、すべてのアクティビティを選択したいと思います:

activities = Activity.objects.exclude(
    UserActivity__user=user,
    UserActivity__is_completed=True
)


現在、これは期待どおりに機能していません。Django はアクティビティ ID のみに基づいて結合を行います。
LEFT OUTER JOIN "achievements_activity_rating" ON ("achievements_base_activity"."id" = "achievements_activity_rating"."activity_id")

他のユーザーが同じアクティビティの UserActivity レコードを持っている場合、同じアクティビティが重複として出力に何度も表示されます。Djangoに次のようなことをさせたいと思います:
LEFT OUTER JOIN "achievements_activity_rating" ON ( "achievements_base_activity"."id" = "achievements_activity_rating"."activity_id" AND "achievements_activity_rating"."user" = "username_of_current_user")

この問題を Django ORM で解決できますか? 私のモデルは奇妙なパターンではないと思うので、これに対する優れた一般的な解決策を期待しています。

4

1 に答える 1

0

まず current_user のアクティビティのみを選択する必要があります

activities = Activity.objects.filter(user=current_user).exclude( UserActivity__is_completed=True)

編集:

activities = UserActivity.objects.all().exclude(user=current_user,is_completed=True)
activities_set =[]
for activity in activities:
    activities_set.append(Activity.objects.filter(pk=activity))
于 2013-10-22T12:14:14.363 に答える