Django多列连接

时间:2013-10-22 08:43:52

标签: django django-models

我有两个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解决这个问题吗?我认为我的模型不是一个奇怪的模式,所以我希望有一个很好的通用解决方案。

1 个答案:

答案 0 :(得分: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))