Django 中数据库的操作,多种查询方法

增加

增加数据有两种方法。

  1. save

    通过创建模型类对象,执行对象的save()方法保存到数据库中。

    from book.models import BookInfo,PeopleInfo
    book = BookInfo(
            name='python入门',
            pub_date='2010-1-1'
        )
    book.save()
    book
    
    <BookInfo: python入门>
    

    在这里插入图片描述

  2. create

    通过模型类.objects.create()保存。

    PeopleInfo.objects.create(
            name='itheima',
            book=book
        )
    
    <PeopleInfo: itheima>
    

修改

修改更新有两种方法

  1. save

    修改模型类对象的属性,然后执行save()方法

    person = PeopleInfo.objects.get(name='itheima')
    person.name = 'itcast'
    person.save()
    person
    
    <PeopleInfo: itcast>
    
  2. update

    使用模型类.objects.filter().update(),会返回受影响的行数

    PeopleInfo.objects.filter(name='itcast').update(name='H_sen')
    1
    

删除

删除有两种方法

  1. 模型类对象delete
person = PeopleInfo.objects.get(name='H_sen')
person.delete()

(1, {'book.PeopleInfo': 1})
  1. 模型类.objects.filter().delete()
BookInfo.objects.filter(name='python入门').delete()

(1, {'book.BookInfo': 1, 'book.PeopleInfo': 0})


查询

基本查询

  • get 查询单一结果,如果不存在会抛出模型类.DoesNotExist异常。

  • all 查询多个结果。

  • count 查询结果数量。

BookInfo.objects.get(id=1)
<BookInfo: 射雕英雄传>

BookInfo.objects.get(pk=2)
<BookInfo: 天龙八部>

BookInfo.objects.get(pk=20)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/python/.virtualenvs/py3_django_1.11/lib/python3.5/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/python/.virtualenvs/py3_django_1.11/lib/python3.5/site-packages/django/db/models/query.py", line 380, in get
    self.model._meta.object_name
book.models.DoesNotExist: BookInfo matching query does not exist.


BookInfo.objects.all()
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>, <BookInfo: 雪山飞狐>]>

BookInfo.objects.count()
4

过滤查询

实现SQL中的where功能,包括

  • filter过滤出多个结果

  • exclude排除掉符合条件剩下的结果

  • get过滤单一结果

对于过滤条件的使用,上述三个方法相同,故仅以filter进行讲解。

过滤条件的表达语法如下:

属性名称__比较运算符=# 属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线
查询编号为1的图书
查询书名包含'湖'的图书
查询书名以'部'结尾的图书
查询书名为空的图书
查询编号为135的图书
查询编号大于3的图书
查询1980年发表的图书
查询199011日后发表的图书

1. 相等

exact:表示判等。

例:查询编号为1的图书。

BookInfo.objects.filter(id__exact=1)
可简写为:
BookInfo.objects.filter(id=1)

2. 模糊查询

contains:是否包含。

说明:如果要包含%无需转义,直接写即可。

例:查询书名包含’传’的图书。

BookInfo.objects.filter(name__contains='传')
<QuerySet [<BookInfo: 射雕英雄传>]>

startswith、endswith:以指定值开头或结尾。

例:查询书名以’部’结尾的图书

BookInfo.objects.filter(name__endswith='部')
<QuerySet [<BookInfo: 天龙八部>]>

以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,
如iexact、icontains、istartswith、iendswith.

3. 空查询

isnull:是否为null。

例:查询书名为空的图书。

BookInfo.objects.filter(name__isnull=True)
<QuerySet []>

4. 范围查询

in:是否包含在范围内。

例:查询编号为1或3或5的图书

BookInfo.objects.filter(id__in=[1,35])
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 笑傲江湖>]>

5. 比较查询

  • gt大于 (greater then)

  • gte大于等于 (greater then equal)

  • lt小于 (less then)

  • lte小于等于 (less then equal)

例:查询编号大于3的图书

BookInfo.objects.filter(id__gt=3)

不等于的运算符,使用exclude()过滤器。

例:查询编号不等于3的图书

BookInfo.objects.filter(id__gt=3)
<QuerySet [<BookInfo: 雪山飞狐>]>

6. 日期查询

year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。

例:查询1980年发表的图书。

BookInfo.objects.filter(pub_date__year=1980)
<QuerySet [<BookInfo: 射雕英雄传>]>

例:查询1990年1月1日后发表的图书。

BookInfo.objects.filter(pub_date__gt='1990-1-1')
<QuerySet [<BookInfo: 笑傲江湖>]>
发布了125 篇原创文章 · 获赞 260 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/weixin_44685869/article/details/105369436