在 Django 过滤器语句中,__exact 和等号 (=) 有啥区别?
Posted
技术标签:
【中文标题】在 Django 过滤器语句中,__exact 和等号 (=) 有啥区别?【英文标题】:In Django filter statement what's the difference between __exact and equal sign (=)?在 Django 过滤器语句中,__exact 和等号 (=) 有什么区别? 【发布时间】:2012-04-15 07:58:48 【问题描述】:在 Django 过滤器语句中,如果我写有什么区别:
.filter(name__exact='Alex')
和
.filter(name='Alex')
谢谢
【问题讨论】:
【参考方案1】:没有区别,第二个暗示使用__exact。
来自documentation:
For example, the following two statements are equivalent:
>>> Blog.objects.get(id__exact=14) # Explicit form
>>> Blog.objects.get(id=14)
# __exact is implied This is for convenience, because exact
# lookups are the common case.
【讨论】:
【参考方案2】:您可以通过将查询集的query
属性转换为字符串来查看 Django 将执行的 SQL:
>>> from django.contrib.auth.models import User
>>> str(User.objects.filter(username = 'name').query)
'SELECT ... WHERE `auth_user`.`username` = name '
>>> str(User.objects.filter(username__exact = 'name').query)
'SELECT ... WHERE `auth_user`.`username` = name '
所以__exact
在这里没有区别。
【讨论】:
【参考方案3】:这与问题不完全相同,但对某些开发人员可能有用。 它取决于 Django 数据库和排序规则。我正在使用 mysql db 和 ci(不区分大小写)排序规则,结果很奇怪。
如果有用户“测试”,最后用空格查询
In : User.objects.filter(username__iexact="Test ")
Out : <QuerySet []>
In : User.objects.filter(username__exact="Test ")
Out : <QuerySet [<User: Test>]>
In : User.objects.filter(username="Test ")
Out : <QuerySet [<User: Test>]>
【讨论】:
以上是关于在 Django 过滤器语句中,__exact 和等号 (=) 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章