2010-10-01 2 views
1

je le code suivant, en utilisant Django ORMDjango: charger un ensemble restreint de champs d'objets chargés à l'aide d'une clé étrangère

routes =Routes.objects.filter(scheduleid=schedule.id).only('externalid') 
    t_list = [(route.externalid, route.vehicle.name) for route in routes]) 

et il est très lent, parce que les objets de véhicules sont énormes (des dizaines de champs , et je ne peux pas changer cela, il vient d'une base de données héritée). Beaucoup de temps est consacré à la création des objets Véhicule, alors que j'ai seulement besoin du champ nom de cet objet.

Existe-t-il un moyen plus efficace d'obtenir t_list? Je cherche quelque chose comme only() pour accéder aux objets via une clé étrangère.

EDIT: la solution est la suivante:

routes=Routes.objects.filter(scheduleid=schedule.id).select_related("vehicle") 
routes= routes.only('externalid','vehicle__name') 

Est-ce qu'il existe quelque chose de semblable?

+0

select_related pourrait être un très mauvais choix, car il obtenir tous ForeignKey domaines connexes liés. Si vous ne définissez pas une profondeur et que la table du véhicule a de nombreuses clés étrangères, l'exécution de la requête sera plus grande. – FallenAngel

+0

@FallenAngel: l'OP limite la portée de 'select_related()' à 'Vehicle'. c'est-à-dire 'select_related' ('véhicule') '. –

Répondre

2

Vous devriez pouvoir faire ceci, je pense. Avertissement: non testé Testé avec des modèles locaux. La requête générée semblait bonne.

routes = Routes.objects.select_related('vehicle').filter(**conditions).only(
      'externalid', 'vehicle__name') 

Pour que cela fonctionne, il devrait être un champ de clé étrangère vehicle déclarée dans le modèle Routes. C'est parce que select_related() suit seulement avant relations.

+0

Cela fonctionne. Je pensais que j'avais déjà essayé, mais apparemment, j'ai dû faire une erreur. J'ai vérifié que les requêtes sql récupèrent juste ce qui est nécessaire. Merci ! – madewulf

+0

BTW, en fait, votre code est équivalent à mon "code idéal" .... Ma question a été répondue. Désolé ... – madewulf

+0

@madewulf: ne soyez pas! Ecrire la question cristallise la pensée. Et dans le processus, nous trouvons souvent la solution :) –

1

Vous pouvez essayer ce qui suit:

Routes.objects.filter(scheduleid__id=schedule.id).values('externalid', 'vehicle__name') 
Questions connexes