您的位置:首页 > 编程语言 > Go语言

Django web开发系列(七)模型操作

2019-06-29 18:36 681 查看

一 前言

在Django web开发系列(二)图书借阅管理系统之模型设计,我们大致了解到Django使用模型存储数据,本节就来继续介绍下Django是如何完成数据存取的。对数据库层的操作,只所以不需要写sql代码,得益于Django提供的一套完备、高效的API,我们根本不需要花费脑力记住它们,使用时查询文档即可。

二 创建对象

from bookms.models import Book
test4=Book(book_name='test4',author_name='test4',total_num=1,book_img='test4.jpg',available_num=1)
test4.save()

上面语句,效果类似执行了一条insert的sql语句,在数据库层的book表里增加了一条记录,test4可以理解成绑定了这条记录的对象。另外,注意:只有显示的调用sava()方法才会将操作响应到数据库。 如果想一行代码实现插入操作,使用create()方法,如下:

test4 = Book.objects.create(book_name='test4',author_name='test4',total_num=1,book_img='test4.jpg',available_num=1)

三 修改对象

test4.book_name = 'new_test4'
test4.save()

上面语句,类型执行了update操作,将test4的字段bookname的值从test4更新为newtest4。

四 查询对象

查询操作是最最重要的内容之一,存储数据的目的就是为了后续查询,而且更新、删除都是基于查询操作的。Django中有个查询结果集(QuerySet)的概念,可以把查询集理解成一个select语句,它代表着查询返回的结果集,也就是对象集合的列表,而且可以级联一个或多个过滤器(filter),这个filter可以和sql里的where对应起来理解。

1 查询所有对象-all()

all_books = Book.objects.all()

查询book表的所有记录;

2 过滤对象

大部分应用场景不是查询所有记录,而且根据特定条件查询,过滤记录常用两个方法: • filter(**kwargs):返回根据指定参数查询出来的结果集; • exclude(**kwargs):返回排除指定参数查询出来的结果集;

举例如下:

Filter过滤器:

Book.objects.filter(book_name='new_test4')

返回了一个book_name是new_test4的结果集:

<QuerySet [<Book: new_test4>]>

Exclude过滤器:

Book.objects.exclude(book_name='new_test4')

返回了一个bookname不是newtest4的结果集:

<QuerySet [<Book: test1>, <Book: test2>, <Book: test0>, <Book: test3>]>

3 查询单一对象

上述的方法返回的对象类型都是QuerySet,类似列表,可迭代可循环,如果想直接返回某个对象,可以使用get方法,如:

one_book = Book.objects.get(pk=6)

上述方法返回了主键是6的对象,主键可以保证唯一性,注意:如果get()查询结果超过1个,会报MultipleObjectsReturned异常;如果get未查到对象,又会抛出DoesNotExist异常。所以,这么多异常可能抛出,还是慎用吧。

4 字段查询

在filter\get\exclude过滤方法中,支持相当多的关键字参数,如:

Book.objects.filter(book_name__contains='test')

返回结果:

<QuerySet [<Book: test1>, <Book: test2>, <Book: test0>, <Book: test3>, <Book: new_test4>]>

上述语句,通过在字段名后缀双下划线_contains,实现了过滤bookname包含test字符的所有对象。其余查询参数罗列如下,使用时双下划线后缀即可。

五 删除对象

删除对象使用delete()方法,可以理解成sql里的delete操作,如下:

>>> test4.delete()
(1, {'bookms.Book': 1})

上面语句删除了刚才插入的test4对象,delete方法是直接操作在数据库的,不需要使用save(),如果想批量删除,可以先过滤再删除,如下:

>>> Book.objects.filter(pk__gt=3).delete()
(2, {'bookms.Book': 2})

上面语句删除了主键大于3的记录,返回的是删除的记录总数和一个字典形式。

总结

本文介绍了Django ORM的基本操作,类似数据库增删改查的操作方法,更多API请学习Django文档。

其他

关于python学习、分享、交流,笔者开通了微信公众号【小蟒社区】,感兴趣的朋友可以关注下,欢迎加入,建立属于我们自己的小圈子,一起学python。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: