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

Popular posts from this blog

How to connect android app to App engine -

gcc - MinGW's ld cannot perform PE operations on non PE output file -

php - display validation error message next to the textbox in codeigniter -