数据模型的定义请参照 https://docs.djangoproject.com/en/2.2/ref/models/
一、保存数据对象
D:\work\code\python\django_01>python manage.py shell
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD6 4)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.contrib.auth.models import User
>>> from blog.models import Post
>>> user = User.objects.get(username='admin')
>>> post = Post(title='ORM post', slug='orm-post', body='orm api and other doc', author = user)
>>> post.save()
这段代码创建了一个post对象,然后post.save()会转化为一条 insert SQL语句将post对象保存到数据库中。
Post.objects.create(title='Insert post', slug='Inert post', body='create method to save object', author=user)
这个create()方法执行后会直接将对象保存到数据库中,不需要再调用save()方法
二、修改数据
修改前面的post对象:
post.title = "update title"
post.save()
这里的save()会转化为一条 update SQL 语句。对象修改后,调用了save() 方法才会保存
三、查询数据
前面的Post.objects.get() 方法从数据库中取出一个单独的数据对象,每个模型都有至少一个管理器,默认的管理器叫做objects。通过使用一个模型管理器,可以得到一个QuerySet,想得到一个数据表里的所有数据对象,可以使用默认模型管理器的all() 方法,像这样:
>>> all_posts = Post.objects.all()
>>> print(all_posts)
<QuerySet [<Post: ORM post>, <Post: hello>]>
四、filter() 方法
>>> Post.objects.filter(publish__year=2019)
<QuerySet [<Post: ORM post>, <Post: hello>]>
>>> Post.objects.filter(publish__year=2019, author__username='admin')
<QuerySet [<Post: ORM post>, <Post: hello>]>
>>> Post.objects.filter(publish__year=2019).filter(author__username='admin')
<QuerySet [<Post: ORM post>, <Post: hello>]>
多字段过滤和链式调用的结果是一样的。
五、exclude() 方法
exclude() 从结果集中去除符合条件的数据
>>> Post.objects.filter(publish__year=2019).exclude(title__startswith='ORM')
<QuerySet [<Post: hello>]>
六、order_by() 方法
Post.objects.order_by('title')
Post.objects.order_by('-title') 降序
如果不指定order_by的排序方式,但在Meta中指定了顺序,则默认会优先以Meta中的顺序排序
七、删除数据
删除一条数据,可以对数据对象直接调用delete() 方法:
>>> post = Post.objects.get(id=1)
>>> post.delete()
(1, {'blog.Post': 1})
filter(), exclude(), all() 这三个方法都返回一个QuerySet对象,所以都可以使用链式调用。
八、QuerySet何时会被求值
可以对一个QuerySet串联任意多的过滤方法,但只有到该QuerySet实际被求值的时候,才会进行数据库操作。
QuerySet仅在下列时候才被实际执行:
- 第一次迭代QuerySet
- 执行切片操作,例如Post.objects.all()[:3]
- pickled或者缓存QuerySet的时候
- 调用QuerySet的repr() 或者len() 方法
- 显式对其调用list() 方法将其转换成列表
- 将其用在逻辑判断表达式中。比如bool(), or, and 和if
九、创建模型管理器
类名后的.objects 就是默认的模型管理器,所有的ORM方法都通过模型管理器操作。除了默认的管理器之外,我们还可以自定义这个管理器。我们要创建一个管理器,用于获取所有status 字段是published 的文章。
自行编写模型管理器有两种方法:一是给默认的管理器增加新的方法,二是修改默认的管理器。第一种方法就像是给你提供了一个新的方法例如: Post.objects.my_manager(),第二种方法则是直接使用新的管理器例如:Post.my_manager.all() 。我们想实现的方式是: Post.published.all() 这样的管理器。
在blog 应用的models.py 里增加自定义的管理器:
class PublishedManager(models.Manager):
def get_queryset(self):
return super(PublishedManager, self).get_queryset().filter(status='published')
class Post(models.Model):
objects = models.Manager() # 默认的管理器
published = PublishedManager() # 自定义管理器
......
在项目根目录下执行 python manage.py shell 启动python命令行
D:\work\code\python\django_01>python manage.py shell
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from blog.models import Post
>>> Post.published.filter(title__startswith='ORM')
<QuerySet [<Post: ORM post>]>
本文内容到此结束,更多内容可关注公众号