2014-01-23 3 views
0

В Python Я знаю, что двойные подчеркивания, предшествующие имени, заставляют Python добавлять classname в имя variable, как в _classname__variable имя (название mangling). Поэтому мой вопрос заключается в том, что в приложении Python/Django меня попросили изменить, есть переменные (?) Имена типа tr_rowid_debtor__de_listed_date__lte. Являются ли эти три переменные (tr_rowid_debtor, de_listed_date и lte) или это какая-то специальная конструкция для Python? Это происходит в заявлении, которое строит строку запроса для Django ...Что означают двойные подчеркивания?

query = DeTransaction.objects.select_related().filter(
    tr_rowid_debtor__de_listed_date__lte=to_date, 
    tr_rowid_debtor__de_rowid_client__cl_rowid=in_client 
).values(
    'tr_rowid_debtor','tr_rowid_debtor__de_listed_date', 
    'tr_payment_date','tr_account','tr_to_agency','tr_to_client' 
) 

Любой совет здесь будет оценен.

+1

Вы должны сделать учебник по Django, где объясняется эта конструкция (использование для пересечения отношений модели). –

+0

Как сказал @DanielRoseman; условие выполняется с использованием поля родственной модели. Кроме того, я разделил один вкладыш на несколько строк для удобства чтения. –

ответ

1

Двойное обозначение подчеркивания используется ORM Django для указания своего рода разделения в запросе. В случае tr_rowid_debtor__de_listed_date__lte происходят три вещи.

  1. tr_rowid_debtor определяет атрибут DeTransaction, который отношения, основанные на том, что происходит дальше
  2. de_listed_date определяет поле соответствующей модели для запроса против
  3. lte говорит выполнить сравнение с использованием <= (менее или равно)

Стоит прочитать: Django's query docs. Прикрывайте их в деталях.

Что касается этого особенного Python, это не так. __ присваивается константе, называемой LOOKUP_SEP. Значение используется с str.split() для генерации предложения WHERE для запросов.

+0

Спасибо всем за ответы, это поможет. Чтение досье Django сейчас. Есть ли хорошая недавняя книга/электронная книга о Django/Python? –