2010-03-02 2 views
7

Я нахожу внешние ключи django немного запутанным, есть ли способ сделать вид ниже, используя один запрос?Django - Получить объекты внешнего ключа в одном запросе?

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

ответ

9

Вы запрос Programme и назначить programme, но вы никогда не использовать результат в любом месте. Просто удалите эту строку.

+0

Да только что заметил это ... doh! Нужно возвращаться, когда я могу иметь больше смысла ... –

9

Я думаю, что вы ищете что-то вроде этого:

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

которые select_related, вы ставите перед окончательным получить. Это ваша линия:

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

должен выглядеть

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

К сожалению, как подчеркнул здесь: get foreign key objects in a single query - Django вы только сможете получить актеров, что способ, как select_related работает только на объектах, имеющих ForeignKeys и не порок наоборот.

+0

'select_related' понадобился бы, только если вы захотите получить доступ к' actor.programme.name' без дополнительного попадания БД на каждого актера. В противном случае это лишнее. – Hamish

Смежные вопросы