vendredi 14 novembre 2014

MySQL - Django comment sélectionner valeur étrangère dans requête - Stack Overflow


Having following models:


User(models.Model):
...
login = ...

Asset(models.Model):
user = models.ForeignKey(User)
...

How to select users login in Asset query using django QuerySet capabilities. For example:


Asset.objects.extra(select = {'user_login' : 'user__login'})

make to return query set with user_login field in each model object




Each Asset object already has a foreign key to the user. So you can always access -


asset = Asset.objects.get(pk=any_id)
if asset.user.login == 'some_value':
do_some_magic()

Please read the documentation.




Use .select_related('user') to select all assets and related users in a single query. Then simply access it through asset.user.login.


assets = Asset.objects.selec_related('user').filter(<any filter>)

for asset in assets:
# no additional queries here, as the user objects are preloaded into memory
print asset.user.login



I have found following solution:


Asset.object.extra( select = {'user_login' : '`%s.%s`' % (User._meta.db_table, 'login') } ).order_by('user__login')

The order_by expression is used to make JOIN on User's model table, than user's login can be accessed in SELECT expression within user_table.login



Having following models:


User(models.Model):
...
login = ...

Asset(models.Model):
user = models.ForeignKey(User)
...

How to select users login in Asset query using django QuerySet capabilities. For example:


Asset.objects.extra(select = {'user_login' : 'user__login'})

make to return query set with user_login field in each model object



Each Asset object already has a foreign key to the user. So you can always access -


asset = Asset.objects.get(pk=any_id)
if asset.user.login == 'some_value':
do_some_magic()

Please read the documentation.



Use .select_related('user') to select all assets and related users in a single query. Then simply access it through asset.user.login.


assets = Asset.objects.selec_related('user').filter(<any filter>)

for asset in assets:
# no additional queries here, as the user objects are preloaded into memory
print asset.user.login


I have found following solution:


Asset.object.extra( select = {'user_login' : '`%s.%s`' % (User._meta.db_table, 'login') } ).order_by('user__login')

The order_by expression is used to make JOIN on User's model table, than user's login can be accessed in SELECT expression within user_table.login


0 commentaires:

Enregistrer un commentaire