• Django 单表查询


    前言

    如何只单独测试django中的某一个py文件呢?或者说如何书写测试脚本?

    我们可以在任意一个py文件(应用下的tests或者自己新建一个)中书写以下代码:

    前期准备 

    创建一个电影表

    class Movie(models.Model):
        title = models.CharField(max_length=64)
        price = models.DecimalField(max_digits=8,decimal_places=2)
        publish_time = models.DateField()   # 年月日
        """
        DateField() 里面可以设置两个参数
        auto_now:每次修改数据的时候,都会自动将最新的更新时间记录下来
        auto_now_add: 只在创建数据的时候将创建时间自动记录下来,之后不会再改变
        """
        # publish_time = models.DateTimeField()   # 年月日 时分秒

    1.create()

    2.all()

    3.filter()

    4.update()

    5.delete()

    6.first()

    7.last()

    8.get()

    9.value()

    10.values_list()

    11.order_by()

    12.count()

    13.exclude()

    14.exists()

    15.reverse()

    16.distinct()

    # 1.create() 返回值是当前被创建数据的对象本身
    # 日期可以手动给
    models.Movie.objects.create(title='红楼梦',price=876.23,publish_time='2014-1-1')
    # 还可以直接传日期对象
    from datetime import date
    ctime = date.today()
    models.Movie.objects.create(title='西游记',price=666.12,publish_time=ctime)
    
    # 2.all()  queryset对象
    res = models.Movie.objects.all()
    print(res)
    
    # 3.filter()  queryset对象 <QuerySet [<Movie: Movie object>]>
    # res = models.Movie.objects.filter(id=1)
    # pk指代的就是当前表的主键字段名,自动查找非常方便
    res = models.Movie.objects.filter(pk=1)
    #res = models.Movie.objects.filter(pk=1,title='python入门') #括号内可以放多个条件,默认是and关系
    print(res)
    #只要是queryset对象,就可以通过.query的方式查看到获取当前对象的内部sql语句
    print(res.query)
    
    # 4.get()  直接获取对象本身(不推荐使用) 当查询条件不存在的时候会直接报错
    res = models.Movie.objects.get(pk=1)
    print(res)
    print(res.title)
    
    # 5.values()  queryset对象,[{},{},{}] 获取指定字段对应的数据
    res = models.Movie.objects.values('title','publish_time')
    print(res)
    
    # 6.values_list()  queryset对象,[(),(),()]  获取指定字段对应的数据
    res = models.Movie.objects.values_list('title','price')
    print(res)
    
    #7.first()  取第一个元素对象  数据对象  #Movie
    res = models.Movie.objects.filter().first()  #filter()可省略
    print(res)
    #
    #8.last() 取最后一个元素对象  数据对象  #Movie
    res = models.Movie.objects.last()
    print(res)
    
    #9.update()  更新数据 返回的是受影响的行数
    res = models.Movie.objects.filter(pk=1).update(title='红楼梦',price=555)
    print(res)
    
    #10.delete()  删除数据  返回值 受影响的表及行数
    res = models.Movie.objects.filter(pk=3).delete()
    print(res)
    
    #11. count()  统计数据条数
    res = models.Movie.objects.filter(pk=1).count()
    print(res)
    
    #12.order_by 按照指定字段排序
    # res =models.Movie.objects.order_by('price') # 默认是升序
    res = models.Movie.objects.order_by('-price') # 减号就是降序
    print(res)
    
    #13.exclude  拿到指定字段之外的数据
    res = models.Movie.objects.exclude(pk=1)
    print(res)
    
    #14.exists()  (了解) 判断指定对象是否有数据 返回布尔值
    res = models.Movie.objects.filter(pk=1000).exists()
    print(res)
    
    #15.reverse()  反转  返回QuerySet对象
    res = models.Movie.objects.order_by('price').reverse()
    print(res)
    
    #16.distinct()  去重:去重的前提 必须是由完全一样的数据才可以 返回QuerySet对象
    res = models.Movie.objects.values('title','price').distinct()
    print(res)

    神奇的下划线查询

    # 1.查询价格大于200的电影
    res = models.Movie.objects.filter(price__gt=200)
    print(res)    #QuerySet对象
    
    # 2.查询价格小于500的电影
    res = models.Movie.objects.filter(price__lt=600)
    print(res)
    
    # 3.查询价格大于等于400的电影
    res = models.Movie.objects.filter(price__gte=400)
    print(res)
    #print(res.query)
    
    # 4.查询价格小于等于400的电影
    res = models.Movie.objects.filter(price__lte=400)
    print(res)
    
    # 5.查询价格 是789 或555 或120
    res = models.Movie.objects.filter(price__in=[789,555,120])
    print(res)
    
    # 6.查询价格再200到700之间的电影  顾头也顾尾
    res = models.Movie.objects.filter(price__range=(200,700))
    print(res)
    
    # 7.查询电影名中包含字母p的电影
    '''
    模糊查询:
          关键字 like
          关键符号 % _
    '''
    # res = models.Movie.objects.filter(title__contains='p')  #默认区分大小写
    res = models.Movie.objects.filter(title__icontains='p')  #忽略大小写
    print(res)
    
    # 8.查询2014年出版的电影
    res =models.Movie.objects.filter(publish_time__year=2014)
    print(res)
    
    # 9.查询是1月份出版的电影
    res = models.Movie.objects.filter(publish_time__month=1)
    print(res)

    小结:

    1.只要是queryset对象就可以无限制的调用queryset对象的方法

    res = models.User.objects.filter(**kwargs).filter().filter().update()/delete()/values()
    2.只要是queryset对象就可以直接点query查看当前queryset对象内部的sql语句
    queryset_obj.query

    查看所有orm语句内部的sql语句

    把下面一段固定的日志文件配置 拷贝到配置文件中即可

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'propagate': True,
                'level': 'DEBUG',
            },
        }
    }
  • 相关阅读:
    react-redux
    Vue中常用的UI框架
    vue中router与route的区别
    H5新增input属性
    H5新增的input类型
    菜鸡对作用域链的理解
    自己对路由的一些理解
    浏览器缓存
    黄瓜的不定期更新面试题
    ajax封装
  • 原文地址:https://www.cnblogs.com/baohanblog/p/12167511.html
Copyright © 2020-2023  润新知