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

时间:2011-03-30 03:54:14

标签: django syntax

所以在django我们写

Entry.objects.filter(blog__id=3)

这看起来很难看,因为有时会有太多的下划线

Entry.objects.filter(blog_something_ 下划线 _too_ 许多 _id = 3)

为什么django不能使用像

这样的语法
[entry.objects if blog.id=3 ]

我不是这方面的专家,但为什么必须双重下划线?写这篇文章时,python的语法会有更优雅的风格吗?

1 个答案:

答案 0 :(得分:9)

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

[entry.objects if blog.id=3 ]

此外,“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中的过滤器函数中,我们可以省去dotstyle函数和笨拙的**,但我们仍然留下字典括号,这可能就是为什么它们用双下划线代替。 / p>