python中in关键字忽略大小写_小白python建站的一些准备(五)

本文探讨了在Python中使用ORM进行网站开发时,如何处理大小写敏感性问题,特别是在MySQL环境下。介绍了如何查看ORM转换的SQL语句,并讲解了`icontains`、`in`等查询关键字的用法,以及`gt`、`lt`、`range`等条件操作。还提到了时间处理和正则表达式的查询条件。
摘要由CSDN通过智能技术生成

   从python建站来说,做网站并没有这么复杂,关键看你想要做成什么类型的网站。例如,不需要虚拟环境,不需要gulp构建工具提升前端页面开发效率,ORM也并不需要了解的那么精通,完全可以用原生SQL代替,redis和membercache也完全不用安装了解,也是可以做一个网站,但是如果志在建立一个单日用户数超过3000,月用户数超过10万的大数据量展示型网站,这些还是有必要去花时间学习,共勉!


十三、ORM查询条件

   orm中,查询一般使用filter,get和exclude实现,查询格式一般为:field+__+condition,在windows系统,mysql的排序规则(collation)无论是什么,都是大小写不敏感的,如果在linux中,mysql排序规则为utf8_bin,那么就是大小写敏感的。

    示例表结构:

9503087bc6f48826bdaf5390c7210791.png9a1232bfed7a9f6407080380e5780f00.png

    先讲如何查看orm转化成底层的sql语句,如果是一个queryset对象,即

# views.pyartsearch = Article.objects.filter(pk=1)print(type(artsearch))  # <class 'django.db.models.query.QuerySet'>print(artsearch.query)# SELECT `test_table`.`id`, `test_table`.`name`, `test_table`.`contents` FROM `test_table` WHERE `test_table`.`id` = 1

    直接用QuerySet的query方法即可取得转化后的sql语句,但如果是ORM模型对象,就不能再使用query方法了,会报错“'Article' object has no attribute 'query'”,导入connection类即可:

from django.db import connectionartsearch = Article.objects.get(pk=1)print(connection.queries)>>>[{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'}, {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'}, {'sql': 'SELECT `test_table`.`id`, `test_table`.`name`, `test_table`.`contents` FROM `test_table` WHERE `test_table`.`id` = 1 LIMIT 21', 'time': '0.000'}]

    列表前两个语句是python自带的,我们看最后一个即可,需要注意的是这两个是互补的关系而非包含。

    icontains,insensitive,大小写不敏感。如果是contains则可以看见BINARY关键字。

artsearch = Article.objects.get(name__icontains="fire book") print(connection.queries)>>> SELECT `test_table`.`id`, `test_table`.`name`, `test_table`.`contents` FROM `test_table` WHERE `test_table`.`name` LIKE '%fire book%' LIMIT 21"

    in,实例如下:

categorys = Category.objects.filter(article__id__in = [1,2,3])## in 接受列表,元组,queryset对象print(categorys)>>>[, , ]>

    可能有些疑惑的是article__id__in这个用法,我打印出来的语句如下:

SELECT `front_category`.`id`, `front_category`.`caname` FROM `front_category` INNER JOIN `test_table` ON (`front_category`.`id` = `test_table`.`category_id`) WHERE `test_table`.`id` IN (1, 2, 3)

   SQL语句INNER JOIN释义,在表中存在至少一个匹配时,INNER JOIN 关键字返回行,INNER JOIN 与 JOIN 是相同的。可以看到这个语句与article_set有些相似,我们昨天的文章中介绍了一对多的表关系中,外键所在的模型中可以利用主表_set的方式获取该外键对象(注意必须是对象,而非queryset)对应主表的内容,而通过其它相关联表的字段来判断是否在某个集合中的方法也是django内置的,除非在建立外键时设置了related_query_name="testname"。

    比较费脑子,我的理解是,假如你知道了某个确切的外键实例对象,你想查找到对应的主表引用了这个实例对象的内容,可以使用主表_set方法;但是,假如你想批量找出符合条件的外键对象所引用的主表数据,那么就可以考虑使用related_query_name来反向(关联)查询

    例如,有个需求,需要找出某篇文章标题包含s的分类,示例代码如下:

# 找出所有符合要求的文章articles = Article.objects.filter(name__icontains='s')# 列出文章的分类categories = Category.objects.filter(testname__in=articles)print(categories)>>><QuerySet [<Category: 1, 热门>, <Category: 2, hot>]>

    或者先简单的记成在filter中都是使用的related_query_name(反向查询),而在实例对象中都是使用related_name(反向引用)。

    gt,greater than;

    lt,lower than;

    gte,greater equal than;

    lte,greater equal than;

    startswith;

    istartswith;

    endswith;

    range,range(start_time, end_time)=>底层sql的between语句,接受的是一个aware time(可以利用django.utils.timezone.make_aware方法),关于时间,数据库里面存的是UTC时间,但是在使用datetime模块取出来的数据时间会翻译成settings.py中TIME_ZONE= 'Asia/Shanghai'所配置的时区时间!示例代码如下:

articles = Article.objects.filter(creat_time__date=datetime(year=2020,month=12,day=7))# articles = Article.objects.filter(creat_time__year__lte=2021)print(articles)>>>[, , ]>

    如果结果为空,可以使用articles.query打印一下sql语句,检查看看是不是Mysql时区未配置,可参考windows配置mysql时区。

    isnull,需要注意的是空字符串和null绝对不是一样的,实测数据库修改该条数据为null和空字符串的结果不同

articles = Article.objects.filter(contents__isnull=True)

     regex与iregex,正则表达式查询条件

articles = Article.objects.filter(name__iregex=r"^s")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值