2013-02-18 5 views
2

Недавно я сделал опечатку в своем коде и заметил, что у меня такое же поведение, поэтому мне было интересно, какая разница между одиночными и двойными подчеркиваниями в запросах django.Django query single underscore ведет себя как двойной знак подчеркивания?

>>> underscore = MyModel.objects.filter(foreign_key_id=var) 
>>> double_underscore = MyModel.objects.filter(foreign_key__id=var) 
>>> underscore == double_underscore 
False 
>>> list(underscore) == list(double_underscore) 
True 

Я не уверен, что метод равенства используется для сравнения querysets, но когда я конвертировать в списки питона я найти точно те же элементы, содержащиеся внутри. Кто-нибудь знает, что здесь происходит?

ответ

7

Эти два поля как раз бывают и с обоими существами.

foreign_key_id - это автоматически созданный столбец объекта MyModel, тогда как foreign_key__id - это идентификатор на самой внешней таблице ключей.

Этих значения будут оба же ..

MyModel1.foreign_key_id == 5 # this is stored on the model 
           # and does not require a lookup. 
MyModel1.foreign_key.id == 5 # this is stored on the target table 
           # and requires a DB hit. 
+0

Как этот эффект вызовы object.filter? Я предполагаю, что __id будет иметь обработчик дескриптора базы данных с соединением, тогда как _id вернет все объекты в таблице MyModel и выполнит фильтрацию в django. Или они оба фильтруют в базе данных, но __id касается двух таблиц, а _id касается только одного? – blackfedora

+1

@blackfedora У вас есть инструменты для просмотра SQL-запросов – wRAR

+0

Спасибо, проверяя с .query, похоже, что одни и те же запросы mysql генерируются в любом случае. – blackfedora

1

foreign_key_id является (скрытым) именем поля MyModel, foreign_key__id является ссылкой на поле на любую модель ссылках поля в foreign_key. Другими словами, это специфическая деталь полей внешнего ключа.

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