• 68.ORM查询条件:date,time,year,week_day等


    1. date:

    首先查看数据库中article表的信息,由表中的create_time字段可以看出时间为2020.2.5

    在这里插入图片描述

    打印出查询的结果:

    <QuerySet []>:但是查询的结果为空的QuerySet,这个的问题在于在我们的mysql数据库中没有存储关于时区的信息。

    并且我们的django底层执行的sql语句为:SELECT article.id, article.title, article.content, article.category_id, article.create_time FROM article WHERE DATE(CONVERT_TZ(article.create_time, 'UTC', 'Asia/Shanghai')) = 2020-02-05,从我们的django底层执行的sql语句可以看出date方法又调用了CONVERT_TZ方法,将article.create_time字段的‘UTC’时区转换为‘Asia/Shanghai’时区,并且将date设置为2020-02-05.但是mysql数据库中并没有存储有关时区的数据。所以我们首先要先将有关时区的文件进行导入。

    解决办法:1.windows系统:
    浏览器中复制该url:https://dev.mysql.com/downloads/timezones.html,找到timezone_2019c_posix.zip - POSIX standard,点击进行下载,下载完成后,进行解压,并且将解压完成的所有文件复制到mysql文件中的:F:mysqlmysql5.7-win32datamysql文件夹中,在进行粘贴之前可以先将mysql文件夹中的文件进行备份,以防粘贴之后mysql不能使用,如果遇到文件名相同的可以选择替换,之后将mysql服务进行重启。
    再次运行项目,打印出结果为:

    <QuerySet [<Article: <(Article: id: 1,title: Hello, content: 你好)>>, <Article: <(Article: id: 2,title: Hello World, content: 大家好)>>, <Article: <(Article: id: 3,title: 钢铁是怎样炼成的, content: 你好
    )>>, <Article: <(Article: id: 4,title: 中国吸引力, content: 精彩极了
    )>>]>, 此时就打印出了数据库表中满足条件的文章。

    原生sql语句:SELECT article.id, article.title, article.content, article.category_id, article.create_time FROM article WHERE DATE(CONVERT_TZ(article.create_time, 'UTC', 'Asia/Shanghai')) = 2020-02-05

    2.Linux或者是Mac系统:
    在终端命令行窗口:mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -D mysql -u root -p ,输入密码,从系统中加载时区文件更新到mysql中。

    2. year: 根据年份进行查找,示例代码如下:

    from .models import Article, Category
    from django.http import HttpResponse
    from datetime import datetime, date
    from django.utils.timezone import make_aware
    
    
    def index1(request):
    # 查找create_time为2020年的文章
        articles = Article.objects.filter(create_time__year=2020)
    # 查找create_time大于等于2020年的文章
        articles = Article.objects.filter(create_time__year__gte=2020)
        print(articles)
        print(articles.query)
        return HttpResponse("success")
    

    3.month: 根据月份进行查找,示例代码如下:

    # 查找create_time为2月份的文章
        articles = Article.objects.filter(create_time__month=2)
    # 查找create_time大于等于2月份的文章
        articles = Article.objects.filter(create_time__month__gte=2)
    

    4. day:根据日期进行查找,示例代码如下:

    # 查找create_time为2号的文章
        articles = Article.objects.filter(create_time__day=2)
    # 查找create_time大于等于2号的文章
        articles = Article.objects.filter(create_time__day__gte=2)
    

    5.week_day:Django 1.11新增的查找方式。同year,根据星期几进行查找。1表示星期天,7表示星期六,2-6表示星期一到星期五。示例代码如下:

    # 查找星期三发布的所有文章
    articles = Article.objects.filter(create_time__week_day=4)
    

    6.time: 根据时间进行查找,示例代码如下:

    在我们的数据库表中,所存储的时间为UTC时区的时间。因此在使用时间进行查找的时候我们可以通过加8个小时进行查找。
    在这里插入图片描述

    from datetime import time
    
    articles = Article.objects.filter(create_time__time=time(hour=11, minute=4, second=59))
    
    此时返回的结果:QuerySet为空,原因是在mysql数据库中存储的时间中的秒,精确到小数点后后六位,所以可以通过使用range区间的方式进行查找,区间可以使用range,以下代码实现:
        start_time = time(hour=11, minute=3, second=30)
        end_time = time(hour=11, minute=3, second=31)
        articles = Article.objects.filter(create_time__time__range=(start_time, end_time))
        print(articles)
        print(articles.query)
        return HttpResponse("success")
    
    此时打印出结果为:

    <QuerySet [<Article: <(Article: id: 3,title: 钢铁是怎样炼成的, content: 你好)>>]>

    执行的原生sql语句:SELECT article.id, article.title, article.content, article.category_id, article.create_time FROM article WHERE TIME(CONVERT_TZ(article.create_time, 'UTC', 'Asia/Shanghai')) BETWEEN 11:03:30 AND 11:03:31

    始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。
  • 相关阅读:
    python 中range函数的用法
    python之字符串中有关%d,%2d,%02d的问题
    大数据面试题
    HDFS的副本存放策略(全)
    hadoop 集群中数据块的副本存放策略
    HDFS 安全模式的理解
    蓝桥杯第十届真题B组(2019年)
    ubuntu下如何编译C语言
    Ubuntu下安装kate编辑器
    Command 'ifconfig' not found, but can be installed with: sudo apt install net-tools
  • 原文地址:https://www.cnblogs.com/guyan-2020/p/12264250.html
Copyright © 2020-2023  润新知