Изменение lookup_type в Django 1.10+
В старых версиях Django вы могли изменить поиск на лету и получить доступ к искомому значению. Например, предположим, что мы храним страну под ее двухбуквенным сокращением ISO, но мы хотим разрешить поиск по названию страны.
from .data import COUNTRIES
class CountryField(…):
def get_prep_lookup(self, lookup_type, value):
if lookup_type == 'icontains':
matching_codes = [
country.code for country in COUNTRIES if value in country.name.lower()
]
lookup_type = "in"
values = matching_codes
# ... perform similar for contains, startswith, endswith, etc. lookups
return super(CountryField, self).get_prep_lookup(lookup_type, value)
Начиная с Django 1.10, get_prep_lookup
не рекомендуется в объекте Field. Они рекомендуют создавать подклассы Lookup
классы и определяющие get_prep_lookup
,
Проблема, насколько я могу судить, в реализации Lookup.get_prep_lookup не позволяет изменить поиск, и метод также не получает значение поиска.