我正在建立一个人们可以登录玩的在线网络游戏。当人们玩游戏时,他们会创建一个结果。此外,他们可以喜欢游戏和结果。
我的主要问题是,我调用数据库的方式有很大差异吗?有一个游戏桌,有一个用户配置文件表。如果我将喜欢保存到游戏桌上的游戏中,或者如果我将喜欢保存到用户配置文件表上的game_likes字段,它会有所不同吗?
例如,如果我的UserProfile看起来像这样:
class UserProfile(models.Model):
user = models.OneToOneField(User, related_name='user_profile')
games_liked = models.ManyToManyField(Game, related_name='games_liked')
我的游戏模型看起来像这样:
class Game(models.Model):
likes = models.ManyToManyField(User, related_name='likes')
哪个更适合拨打数据库?这样:
games_liked = Game.objects.filter(likes=request.user).order_by('-pubdate')
与
games_liked = request.user.user_profile.games_liked.all()
我觉得第二个例子更好,因为它使用直接关系来挑选游戏而不是查询整个游戏索引以找出用户喜欢哪些游戏,但我正在谈论的朋友说Django和SQL索引数据库,以便它们都是相同的。它真的重要吗?
编辑:我当前的网站既保存在游戏上的喜欢字段和UserProfile上的game_likes字段,然后计算喜欢的游戏喜欢字段并寻找UserProfile game_likes字段以查看用户是否喜欢游戏或不是,但我不知道它是否确实有所作为,或者重复表格是否值得寻找时间的差异。
答案 0 :(得分:1)
request.user.user_profile
进行SQL查询以获取用户个人资料,然后user_profile.games_liked.all()
进行第二次SQL查询以获得喜欢的游戏。
因此,从这个角度来看Game.objects.filter(likes=request.user)
更好。
你可以通过查看connection.queries
变量来查看在shell中执行的sql(仅在设置DEBUG = True时可用)
from django.db import connection
user.user_profile.games_liked.all()
Game.objects.filter(likes=user)._as_sql(connection)
print(connection.queries)
无论如何,你的例子似乎破了。 ManyToMany字段创建全新的表来存储关系。你有两次关联游戏:
您应该删除一个字段。
Django创建了一个快捷方式来访问对方的关系。这就是related_name
所代表的含义。因此,对于您的游戏模型,使用game.likes
可以访问用户,并且您可以通过user.likes
访问用户,b / c您已声明related_name='likes'