为什么django在进行筛选查询时必须使用双下划线?
所以在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上运行,它在语法
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})