Django - 查询EXACT字符串匹配

时间:2015-12-02 16:34:01

标签: mysql django django-orm

我的数据库中有一个用户具有此值:

booking_id -> 25DgW

此字段在我的模型中标记为unique

booking_id = models.CharField(null=False, unique=True, max_length=5, default=set_booking_id)

但现在当我像这样查询用户时:

>>> User.objects.get(booking_id='25dgw')  # I think this should throw a DoesNotExist exacption
<User: John Doe>

即使我这样做:

>>> Partner.objects.get(booking_id__exact='25dgw')
<User: John Doe>

我需要一个仅在代码的编写方式与保存在数据库中的方式完全相同的情况下返回用户的查询:25DgW而不是25dgw

我该如何查询?

3 个答案:

答案 0 :(得分:1)

默认情况下,MySQL不考虑字符串的大小写。将有一个字符集和排序规则与数据库/表或列关联。

字符集latin1的默认排序规则,即latin1_swedish_ci,不区分大小写。您必须将排序规则类型更改为latin1_general_cs,以支持区分大小写的比较。

您可以在数据库/表/列级别更改字符集/排序规则设置。

以下步骤对我有用。

  1. 转到MySQL shell

    mysql -u user -p databasename

  2. 更改表/列的字符集和排序规则类型

    ALTER TABLE tablename CONVERT TO CHARACTER SET latin1 COLLATE latin1_general_cs;
    
  3. 现在尝试查询

    Partner.objects.get(booking_id__exact='25dgw')
    

这会引发错误,table matching query does not exist.

参考-Character Sets and Collations in MySQL

答案 1 :(得分:0)

这似乎有效:

qs.filter(booking_id__contains='25DgW').first()

答案 2 :(得分:0)

User.objects.filter(booking_id='25dgw', booking_id__contains='25dgw').first() 似乎对我有用(结果=无)。 booking_id参数用于声明正确的字母,而booking_id__contains则用于声明区分大小写。