django如何在过滤器中实现双下划线?

时间:2017-03-02 00:22:40

标签: python django django-models double-underscore

我注意到Django使用双倍得分来定义lookup个实例中的Model.objects.filter

例如:

Room.objects.filter(width__lte = 10)

它是如何工作的?我如何创建自己的函数,如Django,并知道width__ltewidth实际上是lower then or equal to 10分开。

2 个答案:

答案 0 :(得分:2)

感谢下面的回答,我找到了问题的答案:

Django有一个const LOOKUP_SEP = '__',然后使用split将参数拆分为键值对

答案 1 :(得分:1)

关于自定义查找的

Django 1.10 Documentation

  

仔细查看实现,第一个必需属性是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