2010-03-02 76 views
7

Estoy descubriendo que las claves foráneas de django son un poco confusas, ¿hay alguna forma de hacer la vista a continuación, utilizando una única consulta?Django - ¿Obtiene objetos de clave foránea en una sola consulta?

# 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') 

Respuesta

9

su búsqueda Programme y asignar a programme, pero nunca utilizar el resultado en cualquier lugar. Solo elimina esa línea.

+0

Sí, lo he notado ... doh! Necesito volver cuando pueda tener más sentido ... –

9

creo que lo que busca es algo así:

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

que se select_related, se pone antes de get final. Esa es la línea:

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

debe ser similar

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

desgracia como se subraya aquí: get foreign key objects in a single query - Django que sólo será capaz de recuperar los actores de esa manera tan select_related sólo funciona en objetos que tienen ForeignKeys y no al versa.

+0

'select_related' solo sería necesario si quisiera acceder' actor.programme.name' sin un golpe extra de DB por actor. De lo contrario, es superfluo. – Hamish

Cuestiones relacionadas