2010-03-02 7 views
7

Je trouve que les clés étrangères de django sont un peu confuses, est-ce qu'il y a un moyen de faire la vue ci-dessous, en utilisant une seule requête?Django - Obtient des objets clés étrangers dans une seule requête?

# Model 
class Programme(models.Model): 
    name = models.CharField(max_length = 64) 

class Actor(models.Model): 
    programme = models.ForeignKey(Programme) 
    name = models.CharField(max_length = 64) 


# View 
def list_actors(request, programme_id): 
    programme = Programme.objects.filter(id = programme_id)[0] 
    actors = Actor.objects.filter(programme = programme_id) 
    json = simplejson.dumps([{ 
     'name': str(actor.name), 
     'rating': str(actor.rating),} for actor in actors]) 
    return HttpResponse(json, mimetype='application/javascript') 

Répondre

9

Vous Programme requête et lui attribuer programme, mais vous ne jamais utiliser partout le résultat. Retirez simplement cette ligne.

+0

Yep vient de le remarquer ... doh! Besoin de revenir quand je peux avoir plus de sens ... –

9

Je pense que vous cherchez à quelque chose comme ça:

https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related

qui sont select_related, vous mettez avant get finale. C'est votre ligne:

actors = Actor.objects.filter(programme = programme_id) 

devrait ressembler à

actors = Actor.objects.select_related().filter(programme = programme_id) 

Malheureusement comme le souligne ici: get foreign key objects in a single query - Django vous ne pourrez récupérer les acteurs que comme select_related ne fonctionne que sur des objets ayant ForeignKeys et non vice versa.

+0

'select_related' ne serait nécessaire que si vous vouliez accéder à' actor.programme.name' sans un coup de DB supplémentaire par acteur. Sinon, c'est superflu. – Hamish

Questions connexes