在旧版本的 Django 中,您可以动态更改查找并访问正在查找的值。例如,假设我们通过 ISO 2 字母缩写存储国家,但我们希望允许按国家名称进行搜索。
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 的实现不允许您更改查找,并且该方法也不接收查找值。