django查询mysql 区分大小写,在Django中区分大小写的mysql搜索

I'm trying to do a case insensitive search for a substring within a field in my model.

My model:

class doctor(models.Model):

docid = models.AutoField(primary_key=True, unique=True) # Need autoincrement, unique and primary

name = models.CharField(max_length=35)

username = models.CharField(max_length=15)

regid = models.CharField(max_length=15, default="", blank=True)

photo = models.CharField(

max_length=35, default="", blank=True)

email = models.EmailField(default="", blank=True)

phone = models.CharField(max_length=15)

qualifications = models.CharField(

max_length=50, default="", blank=True)

about = models.CharField(

max_length=35, default="", blank=True)

specialities = models.CharField(

max_length=50, default="", blank=True)

department = models.CharField(max_length=50, default="ENT", blank=True)

fees = models.FloatField(default=300.0)

displayfee = models.IntegerField(default=0, blank=True)

slotrange = models.CharField(max_length=50, blank=True)

slotdurn = models.IntegerField(default=10)

breakrange = models.CharField(

max_length=50, default="", blank=True)

slotsleft = models.CharField(

max_length=50, default="", blank=True)

def __str__(self):

return self.name

def Range(self):

return self.slotrange

def listslots(self):

SlotRange = self.slotrange

SlotDurn = self.slotdurn

startime = SlotRange.split('-')[0]

endtime = SlotRange.split('-')[1]

sthr, stmin = SplitTimeString(startime)

enhr, enmin = SplitTimeString(endtime)

print(stamptoday(sthr, stmin))

print(stamptoday(enhr, enmin))

startstamp = stamptoday(sthr, stmin)

endstamp = stamptoday(enhr, enmin)

secdurn = SlotDurn*60

slotlist = []

for sec in range(startstamp, endstamp, secdurn):

enttime = sec + secdurn

myrange = ("%s - %s" % (HumanTime(sec),

HumanTime(enttime)))

slotlist.append(myrange)

return slotlist

Under the field 'name' in my mysql database, are two rows with values for name as 'Joel' and 'Jaffy Joel'.

When I do the search like this:

from appointments.models import customer, doctor, appointment

doctor.objects.filter(name__icontains='joel')

Output:

But when I do:

doctor.objects.filter(name__icontains='Joel')

Output:

, ]>

Why isnt the case insensitive search working for a lowercase search?

解决方案

As pointed out in the django docs,

In MySQL, a database table’s “collation” setting determines whether

exact comparisons are case-sensitive. This is a database setting, not

a Django setting. It’s possible to configure your MySQL tables to use

case-sensitive comparisons, but some trade-offs are involved. For more

information about this, see the collation section in the databases

documentation.

In my case, I solved it with

from django.db.models import Q,CharField

from django.db.models.functions import Lower

CharField.register_lookup(Lower, "lower")

doctor.objects.filter(Q(name__lower__contains='joel'))

The tip in this regard was provided by Matthew Pava from the django-users mailing list.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值