zoukankan      html  css  js  c++  java
  • 67.ORM查询条件:range的使用,使用make_aware将navie time 转换为aware time

    模型的定义,models.py文件中示例代码如下:
    from django.db import models
    
    
    # 在定义模型的类时,一定要继承models.Model
    class Category(models.Model):
    # 设置字段的最大长度为100
        name = models.CharField(max_length=100)
    
    	# 重新定义该类的一些属性
        class Meta:
        # 自定义表名
            db_table = 'category'
    
    
    class Article(models.Model):
        title = models.CharField(max_length=100)
        content = models.TextField()
        # 设置删除的时候为级联删除
        category = models.ForeignKey('Category', on_delete=models.CASCADE, null=True)
        # 设置auto_now_add=True,就会将所有数据的该属性的初始值设置为添加数据时的时间,并且允许为空值
        create_time = models.DateTimeField(auto_now_add=True, null=True)
    
    	# 重写__str(self)方法
        def __str__(self):
            return "<(Article: id: %s,title: %s, content: %s)>" % (self.id, self.title, self.content)
    
    	# 重新定义该类的一些属性
        class Meta:
            db_table = 'article'
    

    range:判断某个field的值是否在给定的区间中。示例代码如下:

    from .models import Article, Category
    from django.http import HttpResponse
    from datetime import datetime
    
    
    def index(request):
    # 设置一个开始日期,采用datetime()方法,并且为参数传递相应的值
        start_date = datetime(year=2020, month=2, day=5, hour=2)
        # 设置一个结束日期
        end_date = datetime(year=2020, month=2, day=5, hour=23)
        # 使用range查询条件查找在一定时间段的文章
        # 为模型所形成的表的字段规定相应的查询条件,可以使用“字段名__查询条件”=‘value’,进行查询
        articles = Article.objects.filter(create_time__range=(start_date,end_date))
        # 打印出django底层执行的sql语句
        print(articles.query)
        # 打印出符合时间段的QuerySet对象
        print(articles)
        return HttpResponse('success !')
    
    查看打印出的结果:

    SELECT article.id, article.title, article.content, article.category_id, article.create_time FROM article WHERE article.create_time BETWEEN 2020-02-05 02:00:00 AND 2020-02-05 23:00:00

    <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: 精彩极了)>>]>

    此时出现警告信息:RuntimeWarning: DateTimeField Article.create_time received a naive datetime (2020-02-05 23:00:00) while time zone support is active.RuntimeWarning),意思是:模型Article的create_time字段收到了一个navie time(即幼稚的时间,不知道自己处于哪个时区),但是时区支持的是active time(知道自己是哪个时区的时间)。
    解决警告信息的操作:在项目的settings.py文件中,将USE_TZ = True设置为True,默认情况下为True;将TIME_ZONE = 'UTC',设置当前所处的时区,或者是你的项目所运行的时区,当前设置为TIME_ZONE = 'Asia/Shanghai'。并且在views.py文件中进行以下修改:
    # 从django.utils.timezone模块中导入make_aware()函数
    from django.utils.timezone import make_aware
    
    # 执行make_aware()函数将navie time 转换为active time。
    	start_date = make_aware(datetime(year=2020, month=2, day=5, hour=2))
        end_date = make_aware(datetime(year=2020, month=2, day=5, hour=23))
        
    
    之后再次运行项目:

    SELECT article.id, article.title, article.content, article.category_id, article.create_time FROM article WHERE article.create_time BETWEEN 2020-02-04 18:00:00 AND 2020-02-05 15:00:00 : 此时我们的时间就会变成“Asia/Shanghai”时区的时间。

    在这里插入图片描述
    总结:在提取数据的时候要使用django.utils.timezone.make_aware 先将datetime.datetime 从naive时间转变为aware时间,make_aware会将给定的时间转换为TIME_ZONE中指定的失去的时间。

    始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。
  • 相关阅读:
    课堂作业
    大道至简读后感
    读《大道至简》有感
    大道至简第四章-流于形式的沟通
    Java课堂动手动脑-截图集锦
    Java动手动脑课后作业1-求创建对象个数
    Java-消息框显示两整数加减乘除
    JAVA-实践问题
    Java-整数相加求和
    大道至简-是懒人造就了方法
  • 原文地址:https://www.cnblogs.com/guyan-2020/p/12263093.html
Copyright © 2011-2022 走看看