Двойное подчеркивание Django

в Django, вы можете сделать запросы к базе данных следующим образом:

Model.objects.filter(name__icontains = 'bob')

вопрос в том, как это работает "под прикрытием"? Является ли двойное подчеркивание вещью Django или вещью Python? Это всего лишь одна переменная name__icontains, или это какой-то синтаксис доступа к атрибутам? В первом случае, как filter метод Parse имя переменной, чтобы определить, что вы ищете Model "таблица" на имя содержит куда-то строка bob?

1 ответов


это вещь Django, реализованная с некоторыми вещами Python.

в Python вы можете получить словарь аргументов ключевого слова, переданных функции или методу:

>>> def func(*args, **kwargs):
...     print(kwargs)
>>> func(a=1, b=2)
{'a': 1, 'b': 2}

оттуда он может просто перебирать ключи словаря и разбивать их на __, а затем интерпретируйте его так, как он хочет. В этом случае он принимает последнюю часть и интерпретирует icontains как содержит без учета регистра.