2013-03-18 5 views
0

Работа с проектом django и попытка ускорения вызовов. Я заметил, что Django автоматически выполняет второй запрос, чтобы усмотреть любые отношения с внешним ключом. Например, если мои модели выглядит следующим образом:Django откладывание внешнего ключа вверх

Model Person: 
    name = model.CharField("blah") 

Model Address: 
    person = model.ForeignKey(Person) 

Тогда я делаю:

p1 = Person("Bob") 
address1 = Address(p1) 
print (p1.id) #let it be 1 cause it is the first entry 

тогда, когда я звоню:

address1.objects.filter(person_id = "1") 

я получаю:

Запрос # 1: SELECT address. address

Запрос № 2: SELECT person. id, person.name ОТ person

Я хочу избавиться от второго вызова, запроса №2. Я попытался использовать «defer» из документации django, но это не сработало (на самом деле это делает еще больше вызовов). «значения» - это возможность, но на самом деле есть еще много полей, которые я хочу потянуть. Единственное, что я хочу сделать, это не оценивать FOREIGN KEY. Я был бы счастлив вернуть человека или нет. Это значительно сокращает время выполнения, особенно когда я выполняю команду, например: Address.objects.all(), потому что Django оценивает каждый внешний ключ.

ответ

0

Только что просмотрев другой вопрос по той же проблеме, я собираюсь предположить, что вы определили метод __unicode__, который ссылается на поле ForeignKey. Если вы запросите некоторые объекты в оболочке и выведете их, будет вызван метод __unicode__, который требует запроса для получения ForeignKey. Решение состоит в том, чтобы либо переписать этот метод, чтобы он не нуждался в этой ссылке, либо, как я сказал в другом вопросе, используйте select_related().

В следующий раз, пожалуйста, предоставьте полный код, включая некоторые, которые на самом деле демонстрируют проблему, с которой вы сталкиваетесь.

+0

Я обнаружил, что мой __unicode__ сделал ссылку self.house.id. Это, похоже, прояснило проблему! Благодарю. Я не могу выдвигать свою кандидатуру из-за недостаточной репутации, но люди, которые могут это продвинуть! – user1639926

+0

Спасибо. Вы все равно можете принять ответ. –

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