我注意到Django
使用双倍得分来定义lookup
个实例中的Model.objects.filter
。
例如:
Room.objects.filter(width__lte = 10)
它是如何工作的?我如何创建自己的函数,如Django,并知道width__lte
和width
实际上是lower then or equal to 10
分开。
答案 0 :(得分:2)
感谢下面的回答,我找到了问题的答案:
Django
有一个const LOOKUP_SEP = '__'
,然后使用split
将参数拆分为键值对
答案 1 :(得分:1)
仔细查看实现,第一个必需属性是lookup_name。这允许ORM理解如何解释name__ne并使用NotEqual生成SQL。按照惯例,这些名称始终是仅包含字母的小写字符串,但唯一的硬性要求是它不能包含字符串__。
来自其他来源:
查找:这些基本上是“查询的WHERE子句中的一个条件”。 django中的示例是
lt, gt, gte, contains
等等。要创建自定义查找,请继承models.Lookup
。您设置了lookup_name并实现了.as_sql()
方法。然后,您可以为其有效的各种字段类型注册它。
您可以阅读更多here。
我也在引用this answer:
from django.db.models import Lookup
class AbsoluteValueLessThan(Lookup):
lookup_name = 'lt'
def as_sql(self, qn, connection):
lhs, lhs_params = qn.compile(self.lhs.lhs)
rhs, rhs_params = self.process_rhs(qn, connection)
params = lhs_params + rhs_params + lhs_params + rhs_params
return '%s < %s AND %s > -%s' % (lhs, rhs, lhs, rhs), params
AbsoluteValue.register_lookup(AbsoluteValueLessThan)
注册时,您只需使用
Field.register_lookup(AbsoluteValueLessThan)
。
从stackoverflow本身我有django 双下划线__ 的含义。 Have a look here