Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么django在进行筛选查询时必须使用双下划线?_Django_Syntax - Fatal编程技术网

为什么django在进行筛选查询时必须使用双下划线?

为什么django在进行筛选查询时必须使用双下划线?,django,syntax,Django,Syntax,所以在django我们写 Entry.objects.filter(blog__id=3) 这看起来很难看,因为有时候下划线太多了 Entry.objects.filter(blog\u something\u下划线\u too\u many\u id=3) 为什么django不能使用这样的语法 [entry.objects if blog.id=3 ] ? 我不是这方面的专家,但为什么必须加倍强调?python语法中是否有更优雅的风格来编写此代码?Django在python上运行,它在语法

所以在django我们写

Entry.objects.filter(blog__id=3)
这看起来很难看,因为有时候下划线太多了

Entry.objects.filter(blog\u something\u下划线\u too\u many\u id=3)

为什么django不能使用这样的语法

[entry.objects if blog.id=3 ]
?


我不是这方面的专家,但为什么必须加倍强调?python语法中是否有更优雅的风格来编写此代码?

Django在python上运行,它在语法方面设置了一些基本约束,使得以下建议的语法不可能(python不允许对基本语法进行太多的重新定义):

此外,“blog”和“id”不是对象,它们指的是数据库中的名称,因此将它们称为
blog.id
也是有问题的。当然,除非它是以字符串的形式输入的,这实际上就是所要做的,因为关键字参数在Python中是作为字典对象传递的。当然,也可以通过其他方式实现,下面是一个如何使用点作为分隔符的示例:

def dotstyle(dict):
    retdict = {}
    for key, value in dict.items():
         retdict[key.replace(".", "__")] = value
    return retdict

Entry.objects.filter(**dotstyle({"blog.id": 3})

通过将其合并到Django中的filter函数中,我们可以去掉dotstyle函数和笨拙的**,但我们仍然保留了字典大括号,这可能就是为什么它们使用双下划线的原因。

我没有发现任何错误,但我对任何其他现实且干净的选项感到好奇。将参数传递给python函数是该语言非常基本的一部分,作者利用了关键字参数名称<代码>字段和查找=kwarg.split(“查找”)
def dotstyle(dict):
    retdict = {}
    for key, value in dict.items():
         retdict[key.replace(".", "__")] = value
    return retdict

Entry.objects.filter(**dotstyle({"blog.id": 3})