1

我有两个 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 仅基于 Activity ID 进行连接,并且:
LEFT OUTER JOIN "achievements_activity_rating" ON ("achievements_base_activity"."id" = "achievements_activity_rating"."activity_id")

如果其他用户有相同 Activity 的 UserActivity 记录,这将使相同的 Activity 在输出中多次显示为重复项。我想我希望 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 回答