Django的双下划线

20 投票
1 回答
10446 浏览
提问于 2025-04-17 02:28

在Django中,你可以像下面这样进行数据库查询:

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

问题是:这背后是怎么运作的?这个双下划线是Django特有的,还是Python的特性?这是一个叫做 name__icontains 的单一变量,还是某种属性访问的语法?如果是前者,那么 filter 方法是怎么解析这个变量名的,从而知道你是在搜索 Model 表中包含字符串 bob 的名字呢?

1 个回答

20

这是一个关于Django的内容,里面用到了一些Python的知识。

在Python中,你可以获取传递给函数或方法的关键字参数,并把它们放在一个字典里:

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

接下来,它可以简单地遍历这个字典的键,并用__进行分割,然后根据需要进行解释。在这个例子中,它会取最后一部分,把icontains理解为不区分大小写的包含。

撰写回答