Django 1.7 - SQL - 从一对多关系中获取数据,其中关系可能存在,也可能不存在

时间:2015-01-06 10:09:47

标签: python sql django

我有以下数据库布局,

用户(有一个) User_Profile
User_Profile (没有,一个或多个) World_Profile
World_Profile (有一个)世界

我想选择所有世界对象的列表,如果用户存在世界个人资料 世界个人资料也。

World 表的属性为is_public。我想获得所有 World 的列表,其中包含is_public = True,或者用户的 World_Profile

我怀疑它与select_related术语有关,但我还没有成功。任何帮助将不胜感激。

表格属性

用户(username,first_name,last_name,email) User_Profile(用户名(FK->用户),info,foo,bar) World_Profile(user_profile(FK),world(FK),character_name,gold) 世界(world_name,game_speed,is_public,requires_subscription)

解决

filter_string = Q(is_public = True) | Q(worldprofile__user_profile__user=user)
World.objects.select_related().filter(filter_string)

经过大量的试验和错误后找到了解决方案,不确定为什么worldprofile不需要下划线,我必须检查出来。谢谢大家。

2 个答案:

答案 0 :(得分:1)

简单的部分是获取当前登录的用户,该用户可在request.user中找到。由于django提供反向关系"免费",您可以执行以下操作:

user = request.user
user.user_profile.world_profile_set.filter(world__is_public=True)

答案 1 :(得分:0)

filter_string = Q(is_public = True) | Q(worldprofile__user_profile__user=user)
World.objects.select_related().filter(filter_string)

经过大量试验和错误后找到解决方案,不确定为什么worldprofile不需要下划线,我必须检查出来。谢谢大家。