zoukankan      html  css  js  c++  java
  • Django单表查询及其方法

    单表查询

    前期准备

    首先新建一个test的python文件,然后再manage.py中导入main语句及其下面的复制到新文件中
    并导入django 写上django.setup() 就可以导入对应的models进行数据操作了

    import os
    
    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "book_manage.settings")
        import django
    
        django.setup()
        from book_cms import models
    
        res = models.Author.objects.all()
        print(res)
    
    

    setting中的配置输出原生SQL语句的代码

    如果你想知道你对数据库进行操作时,Django内部到底是怎么执行它的sql语句时可以加下面的配置来查看

    在Django项目的settings.py文件中,在最后复制粘贴如下代码:

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console':{
                'level':'DEBUG',
                'class':'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'propagate': True,
                'level':'DEBUG',
            },
        }
    }
    

    MODEL中的表字段

    class Book(models.Model):
        name = models.CharField(max_length=32)
        price = models.DecimalField(max_length=8, decimal_places=2, max_digits=8)
        publish = models.ForeignKey(to='Publish')
        authors = models.ManyToManyField(to='Author')
    
        def __str__(self):
            return "书名:%s|价格%s|出版社:%s"%(self.name,self.price,self.publish)
    
    #DateField里面的参数
    #	auto_now_add:创建数据记录的时候会把当前时间添加到数据库。
    #	auto_now:每次更新数据记录的时候会更新该字段。
    
    

    完整的表结构和表数据

    id	图书名	作者名	价格	出版社
    1	西游记	吴承恩	55.5	商务印书馆
    2	牡丹亭	汤显祖	78	上海古籍出版社
    3	利用Python进行数据分析	麦金尼	89.2	机械工业出版社
    4	非理性繁荣	罗伯特席勒	46.9	中国人民大学出版社
    5	高等数学	同济大学出版社	40	高等教育出版社
    

    单表操作回顾

    新增数据

    	# 第一种:有返回值,并且就是当前被创建的数据对象
        modles.Book.objects.create(name='',price='',publish='',author='',create_time='2019-5-1')
        # 第二种:先实例化产生对象,然后调用save方法保存
        book_obj = models.Book(name='',price='',publish='',author='',create_time='2019-5-1')
        book_obj.save()
        # 2.验证时间格式字段即可以传字符串也可以传时间对象
        import datetime
        ctime = datetime.datetime.now()
        book = models.Book.objects.create(name='',price='',author='',create_time=ctime)
    

    删除数据

    		"""删除数据"""
        # 1.删除书名为xxx的这本书  queryset方法
        res = models.Book.objects.filter(name='').delete()
        print(res)
        # 2.删除书名为xxx的这本书  queryset方法
        res = models.Book.objects.filter(name='').first()
        res.delete()
    

    修改数据

        # 1.queryset修改
        models.Book.objects.filter(name='').update(price='')
        # 2.对象修改
        book = models.Book.objects.filter(name='').first()
        book.price = 66.66
        book.save()  # 对象只有保存方法 这样也能实现修改需求
    

    单表查询的13个方法

    强调:只要是QuerySet对象就可以无限制的点QuerySet的方法

    QuerySet对象可以作为判断的条件,为空的时候对应的布尔值也是False

    all()

    all方法将查询的全部数据查询出来

     res = models.Book.objects.all()
     print(res)
    
    <QuerySet [
    <Book: 书名:西游记|价格55.50|出版社:商务印书馆>, 
    <Book: 书名:牡丹亭|价格78.00|出版社:上海古籍出版社>, 
    <Book: 书名:利用Python进行数据分析|价格89.20|出版社:机械工业出版社>, 
    <Book: 书名:非理性繁荣|价格46.90|出版社:中国人民大学出版社>, 
    <Book: 书名:高等数学|价格40.00|出版社:高等教育出版社>]>
    

    filter()

    想当与MySQL中的where后面跟筛选条件

     res = models.Book.objects.filter(name='西游记')
     print(res)
     <QuerySet [<Book: 书名:西游记|价格55.50|出版社:商务印书馆>]>
    

    为了方便演示我在数据库中添加一条数据

    6	西游记	吴承恩	37	上海古籍出版社
    
    

    如果有多条会返回多条的数据

    res = models.Book.objects.filter(name='西游记')
    print(res)
    
    <QuerySet 
    [<Book: 书名:西游记|价格55.50|出版社:商务印书馆>, 
    <Book: 书名:西游记|价格37.00|出版社:上海古籍出版社>]>
    

    可以在filter里面跟上多个条件,关系是and的关系

    
        res = models.Book.objects.filter(name='西游记', price=37.00)
        print(res)
        <QuerySet [<Book: 书名:西游记|价格37.00|出版社:上海古籍出版社>]>
    

    可以利用query打印出SQL语句

    SELECT
    	`book_cms_book`.`id`,
    	`book_cms_book`.`name`,
    	`book_cms_book`.`price`,
    	`book_cms_book`.`publish_id` 
    FROM
    	`book_cms_book` 
    WHERE
    	( `book_cms_book`.`name` = 西游记 AND `book_cms_book`.`price` = 37 )
    

    get方法

    get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。(源码就去搂一眼~诠释为何只能是一个对象),通常用在查询的值为主键的时候

    两个值报错

      res = models.Book.objects.get(name='西游记')
        print(res)
    book_cms.models.MultipleObjectsReturned: get() returned more than one Book -- it returned 2!
    

    不存在值的时候报错

        res = models.Book.objects.get(name='西游记001')
        print(res)
    book_cms.models.DoesNotExist: Book matching query does not exist.
    
    

    一个值得时候返回对象

    res = models.Book.objects.get(name='高等数学')
        print(res, type(res))
    书名:高等数学|价格40.00|出版社:高等教育出版社 <class 'book_cms.models.Book'>
    

    execute()

    它包含了与所给筛选条件不匹配的对象

        res = models.Book.objects.exclude(name='西游记')
        print(res, type(res))
        
    <QuerySet [<Book: 书名:牡丹亭|价格78.00|出版社:上海古籍出版社>, <Book: 书名:利用Python进行数据分析|价格89.20|出版社:机械工业出版社>, <Book: 书名:非理性繁荣|价格46.90|出版社:中国人民大学出版社>, <Book: 书名:高等数学|价格40.00|出版社:高等教育出版社>]> <class 'django.db.models.query.QuerySet'>
    

    同样也支持多个参数,关系为and关系

    order_by()

    返回QuerySet对象

    对查询结果排序('-id')/('price')

    可以传入多个排序字段

    默认正序,如果用反查在字段前加-

    res = models.Book.objects.filter(name = '西游记').order_by('-price')
    print(res, type(res))
    <QuerySet [
     <Book: 书名:西游记|价格55.50|出版社:商务印书馆>, 
     <Book: 书名:西游记|价格37.00|出版社:上海古籍出版社>]> 
    
    

    reverser()

    对结果进行反向排序,前提是必须要有排序字段

    count()

    返回数据库中匹配查询(QuerySet)的对象数量。返回数字
    

    first()

    返回第一条记录,为表记录里面的对象

    last()

    返回最后一条记录,为表记录里面的对象

    exists

    对查询出来的Query Set进行有误数据的判断,有就返回True,否则返回False

    values(*field)

    返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列

    distinct():

    从返回结果中剔除重复纪录,去重的前提必须是返回的数据要所有的都重复才能去重

    查询方法的返回值类型总结

    返回QuerySet对象的方法有

    all() ,filter() ,exclude() ,order_by() ,reverse() ,distinct()

    特殊的QuerySet

    values() 返回一个可迭代的字典序列

    values_list() 返回一个可迭代的元祖序列

    返回具体对象的

    get() ,first() ,last()

    返回布尔值的方法有:

    exists()

    返回数字的方法有

    count()

    基于双下划线的查询

    使用方式

    res = models.Book.objects.filter(price__gt=60)
    print(res, type(res))
    <QuerySet [<Book: 书名:牡丹亭|价格78.00|出版社:上海古籍出版社>, 
    <Book: 书名:利用Python进行数据分析|价格89.20|出版社:机械工业出版社>]> 
    <class 'django.db.models.query.QuerySet'>
    

    其他类似方法

    Book.objects.filter(price__in=[100,200,300]) //in
    Book.objects.filter(price__gt=100)  //greater than 大于
    Book.objects.filter(price__lt=100) //less than 小于
    Book.objects.filter(price__gte=100)  // greater than equal 大于等于
    Book.objects.filter(price__lte=100) //less than equal 小于等于
    Book.objects.filter(price__range=[100,200]) //between 100 and 200
    Book.objects.filter(title__contains="python") // like %python%
    Book.objects.filter(title__icontains="python") //忽略大小写查询
    Book.objects.filter(title__startswith="py") //py%
    Book.objects.filter(pub_date__year=2012) // 针对日期查询year为2012 可以查询月份和天数
    
  • 相关阅读:
    python requests 上传excel数据流
    No module named 'requests_toolbelt'
    code
    pytest 打印调试信息
    python3 获取日期时间
    Java单元测试之JUnit篇
    The import junit cannot be resolved解决问题
    什么是索引
    python3 ini文件读写
    js 测试题
  • 原文地址:https://www.cnblogs.com/ruhai/p/10987240.html
Copyright © 2011-2022 走看看