在 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 和等号 (=) 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Django 查询集的过滤内置条件

Django 字段查询谓词表

Django 字段查询谓词表

将 kwargs 传递给 Django 过滤器

Django 第十课 4.ORM查询操作

python测试开发django-171.ORM查询之exact和iexact