码迷,mamicode.com
首页 > 其他好文 > 详细

Django单表查询及其方法

时间:2019-06-07 00:48:06      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:rgs   超过   where   默认   matching   code   select   lte   first   

import os
if __name__ == '__main__':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "untitled15.settings")
    import django
    django.setup()

    from app01 import models

    books = models.Book.objects.all()
    print(books)
DateField里面的参数
    auto_now_add:创建数据记录的时候会把当前时间添加到数据库。
    auto_now:每次更新数据记录的时候会更新该字段。

************强调:只要是queryset对象就可以无限制的点queryset的方法**************
queryset对象可以作为判断的条件,为空的时候对应的布尔值也是False



    models.Book.objects.filter().filter().filter().filter().filter().filter()
    <1> all():                  查询所有结果
    <2> filter(**kwargs):       它包含了与所给筛选条件相匹配的对象 
    <3> get(**kwargs):          返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。(源码就去搂一眼~诠释为何只能是一个对象)
    <4> exclude(**kwargs):      它包含了与所给筛选条件不匹配的对象
    <5> order_by(*field):       对查询结果排序('-id')/('price')
    
    <6> reverse():              对查询结果反向排序   >>>前面要先有排序才能反向
    <7> count():                返回数据库中匹配查询(QuerySet)的对象数量。
    <8> first():                返回第一条记录
    <9> last():                返回最后一条记录
    <10> exists():              对查询出来的QuerySet进行有误数据的判断,有就返回True,否则返回False
    <11> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列                             model的实例化对象,而是一个可迭代的字典序列
    <12> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
    <13> distinct():            从返回结果中剔除重复纪录


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)

表字段

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

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():

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

基于双下划线的查询

使用方式

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])
Book.objects.filter(price__gt=100)
Book.objects.filter(price__lt=100)
Book.objects.filter(price__gte=100)
Book.objects.filter(price__lte=100)
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 可以查询月份和天数

Django单表查询及其方法

标签:rgs   超过   where   默认   matching   code   select   lte   first   

原文地址:https://www.cnblogs.com/ruhai/p/10987240.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!