python - Django: Which database call is faster/better? -
i'm building online internet game people can log in play. when people play game, create result. in addition, can games , results.
my main question is, there significant difference in way make calls database? there table games , there table user profiles. make difference if save likes game on game table, or if save likes game_likes field on user profile table?
for example, if userprofile looked this:
class userprofile(models.model): user = models.onetoonefield(user, related_name='user_profile') games_liked = models.manytomanyfield(game, related_name='games_liked') and game model looked this:
class game(models.model): likes = models.manytomanyfield(user, related_name='likes') which better making calls database? this:
games_liked = game.objects.filter(likes=request.user).order_by('-pubdate') versus:
games_liked = request.user.user_profile.games_liked.all() i feel second example better because uses direct relations pick games instead of querying entire game index figure out games have been liked user, friend talking said django , sql index databases same either way. matter?
edit: current site saving both likes field on game , game_likes field on userprofile, counting game's likes field likes , seeking userprofile game_likes field see if user has liked game or not, don't know if makes difference or if duplicating tables makes not worth difference in seek time.
request.user.user_profile makes sql query user profile, user_profile.games_liked.all() makes second sql query liked games.
so, form point of view game.objects.filter(likes=request.user) better.
you can check sql executed, in shell, looking connection.queries variable (available if setting debug=true)
from django.db import connection user.user_profile.games_liked.all() game.objects.filter(likes=user)._as_sql(connection) print(connection.queries) anyway, example seems broken. manytomany field creates whole new table store relationships. , have linked games twice:
- userprofile -> _m2m_table -> games (by userprofile.games_liked)
- user -> _m2m_table -> games (by games.likes)
you should remove 1 field.
django creates shortcuts access relation opposite side. related_name stands for. game model, use have access users game.likes, , user have access games user.likes, b/c have declared related_name='likes'
Comments
Post a Comment