人生苦短
我用Python

Django015-模型|QuerySet

Django015-模型|QuerySet

提到数据库操作就令自己头疼,刚开始接触数据的时候,对这些关系就是完全懵逼的节奏,现在也没有完全将数据库拿下。。。只能边搞边学习啦!

还是先来看看添加吧:

当我们建立数据模型之后,Django会自动为你生成一套数据库抽象的API,可以进行创建(添加)、检索、更新、删除对象。

这里为何要说成对象呢?那是因为使用Django创建的数据库表中的每行都对应一个Django特有的对象。

在进行创建之前,我们需要做些什么?

答:当然是先创建上文中描述过的对象喽!

下面引入官方的实例:

from django.db import models

class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()

def __str__(self): # __unicode__ on Python 2
return self.name

class Author(models.Model):
name = models.CharField(max_length=50)
email = models.EmailField()

def __str__(self): # __unicode__ on Python 2
return self.name

class Entry(models.Model):
blog = models.ForeignKey(Blog)
headline = models.CharField(max_length=255)
body_text = models.TextField()
pub_date = models.DateField()
mod_date = models.DateField()
authors = models.ManyToManyField(Author)
n_comments = models.IntegerField()
n_pingbacks = models.IntegerField()
rating = models.IntegerField()

def __str__(self): # __unicode__ on Python 2
return self.headline

O(∩_∩)O~ 华丽的分割线

在创建对象之前,先来区分几个要点,不然会懵逼的哦!

首先要知道Django ORM用到三个类:

  • Manager

    Manager定义表级方法(就是影响一条或多条记录的方法),可以使用models.Manager为父类,定义自己的Manager,增加表级方法

  • QuerySet

    QuerySet是一个可遍历结构、包含一个或多个元素,每个元素都是一个Model的实例(对象),它里面的方法是表级方法。

  • Model

    继承django.db.models中的Model类,定义我们自己的表。

QuerySet介绍

每个Model都有一个默认的Manager 实例,名为objects,而QuerySet有两种来源:通过Manager的方法得到或QuerySet方法得到。

Manager的方法和QuerySet的方法大部分一致,如filter(),update()等,但也有一些不同,如Managercreate(),get_or_create(),而QuerySetdelete()等。

Manager类的绝大部分是基于QuerySet的,而一个QuerySet包含一个或多个Model对象。

QuerySet创建对象

Django使用一种直观的方式把数据库表中的数据表示成Python对象:一个模型类表示数据库中的一个表,一个模型类的实例(对象)表示数据库表中的一条特定的记录(表中的每行就是一个对象)。

方式一:

>>> blog = models.Blog(name='Siffre', tagline='Siffre@三弗')
>>> blog.save() #单一数据
#查看(属性的调用)
>>> blog.name
'Siffre'
>>> blog.tagline
'Siffre@三弗'
#修改
>>> blog.name = 'Siffre3'
>>> blog.save()
>>> blog.name
'Siffre3'

上述代码执行了SQL的insert语句

通过关键字参数来实例化一个对象,然后调用save()方法保存到数据库中。当然,在未显示的调用之前Django是不会访问数据库的。

方式二:

可以使用create()方法:

>> blog1 = models.Blog.objects.create(name='alex', tagline='天王盖地虎')
>>> blog1.name, blog1.tagline
('alex', '天王盖地虎')

方式三:

使用get_or_create()方法:

>>> blog2 = models.Blog.objects.get_or_create(name='Siffre2', tagline='宝塔镇河妖')
>>> blog2
(<Blog: Siffre2>, True)
>>> blog3 = models.Blog.objects.get_or_create(name='Siffre', tagline='宝塔镇河妖')
>>> blog3
(<Blog: Siffre>, False)
  1. 该方法会进行判断是否已存在要添加的内容,并返回对应的值:True/False
  2. 推荐使用该方法!
  3. 其他方法并没有返回值!

方式四:

>>> blog4 = models.Blog()
>>> blog4.name = 'Siffre4'
>>> blog4.tagline = '法海不懂爱'
>>> blog.save()
>>> blog4.name, blog4.tagline

此种方法和方式基本是一致的!

上面所创建的每个对象均是数据库表中的每行,这说是创建对象,其实是在创建数据库表中的单行单行数据。

先来看看打印的结果“

#单一对象
>>> blog4 = models.Blog()
>>>> print(blog4, type(blog4))
Siffre4 <class 'app01.models.Blog'>

#获取所有对象
>>> obj = models.Blog.objects.all()
>>> print(obj, type(obj))
[<Blog: Siffre3>, <Blog: alex>, <Blog: Siffre>, <Blog: Siffre2>] <class 'django.db.models.query.QuerySet'>

其中,显示的Siffre3,Siffre4,alex等是打印对象本身时,返回的值,还记得上面添加的__str__吗?返回的值就是return值;去掉后,就是返回对象本身了。

如下图所示:

QuerySet获取对象

获取对象的方式很多,主要是通过特定的格式和一些方法:

获取所有对象

Entry.objects.all() # 查询所有,表名+objects+方法

>>> obj = models.Entry.objects.all()
>>> print(obj, type(obj))
[] <class 'django.db.models.query.QuerySet'>
  1. 返回的对象是列表形式
  2. 属于Django特有的QuerySet

QuerySet特性

在内部,我们可以创建、过滤、切片和传递查询集而不是真实操作数据库。在你对查询集求值之前,不会发生任何实际的数据库操作。

特性如下:

  • 迭代

    查询集是可迭代的,在首次迭代查询集时执行实际的数据库查询。

for e in Entry.objects.all():
print(e.headline)

注意:不要使用上面的语句来验证数据库中是否至少存在一条记录,使用exists()更高效。

  • 切片
  • 序列化/缓存
  • repr()
  • len()
  • list()
    调用次方法,强制对查询集求值:
entry_list = list(Entry.objects.all())
  • bool()

QuerySet详细操作将在下一篇进行总结!

仅供学习参考:懒执事 » Django015-模型|QuerySet

分享到:更多 ()