Django学习之四 Django ORM 及 模型管理器

数据模型的定义请参照 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仅在下列时候才被实际执行:

  1. 第一次迭代QuerySet
  2. 执行切片操作,例如Post.objects.all()[:3]
  3. pickled或者缓存QuerySet的时候
  4. 调用QuerySet的repr() 或者len() 方法
  5. 显式对其调用list() 方法将其转换成列表
  6. 将其用在逻辑判断表达式中。比如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>]>

本文内容到此结束,更多内容可关注公众号

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值