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 可以查询月份和天数
posted @ 2019-06-06 23:14  如海  阅读(966)  评论(0编辑  收藏  举报