Django中ORM模型操作
Django中APP的models里演示操作的类:
from django.db import models
# Create your models here.
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
def __str__(self):
return '作者:'+self.name
1、增加数据:
>>> from books.models import Publisher
# 向缓存里增加数据存到变量p1里,Pbulisher里的属性是类里定义的变量
>>> p1 = Publisher(name='Apress', address='2855 Telegraph Avenue',
... city='Berkeley', state_province='CA', country='U.S.A.',
... website='http://www.apress.com/')
# 将缓存里的数据映射到数据库里
>>> p1.save()
>>> p2 = Publisher(name="O'Reilly", address='10 Fawcett St.',
... city='Cambridge', state_province='MA', country='U.S.A.',
... website='http://www.oreilly.com/')
>>> p2.save()
>>> publisher_list = Publisher.objects.all() #显示数据库里的所有数据
>>> publisher_list
[<Publisher: Publisher object>, <Publisher: Publisher object>]
2、更新数据:
# 将数据插入数据库中
>>> from books.models import Publisher
>>> p = Publisher(name='Apress', address='2855 Telegraph Avenue',
... city='Berkeley', state_province='CA', country='U.S.A.',
... website='http://www.apress.com/')
# 将插入的数据进行修改
>>> p.name = 'Apress Publishing'
>>> p.save()
>>> p.name
Apress Publishing
相当于执行: UPDATE books_publisher SET name = 'Apress Publishing' WHERE id=52;
3、查询数据:
1)、获取全部对象
1、从一个给定的模型中取出所有记录(返回列表):
>>> from books.models import Publisher
>>> Publisher.objects.all()
<QuerySet [<Publisher: Apress>, <Publisher: O'Reilly>, <Publisher: Apress Publishing>]>
2、输出对象信息
>>> for publisher in publishers:
... print(publisher.name)
... print(publisher.address)
... print(publisher.city)
2)、数据过滤
1、在 Django API 中,我们可以使用 filter()法对数据进行过滤:
>>> Publisher.objects.filter(name='Apress')
<QuerySet [<Publisher: Apress>]>
2、可以传递多个参数到 filter()来缩小选取范围:
多个参数会被转换成包含 AND 的 SQL 从句
>>> Publisher.objects.filter(country="U.S.A.", state_province="CA")
<QuerySet [<Publisher: Apress>, <Publisher: Apress Publishing>]>
3、相似查找:
>>> Publisher.objects.filter(name__contains="press")
<QuerySet [<Publisher: Apress>, <Publisher: Apress Publishing>]>
在 name 和 contains 之间有双下划线。和 Python 一样,Django 也使用双下划线来表明会进行一些魔术般的操作。
__contains 会被 Django 翻译成 LIKE 语句 :
SELECT id, name, address, city, state_province, country, website FROM books_publisher WHERE name LIKE '%press%';
其他的一些查找类型有:
__icontains(大小写无关的 LIKE)
__startswith 和__endswith
__range(SQL BETWEEN 查询)
3)、获取单个对象
有些时候我们更需要获取单个的对象,get()方法就是在此时使用的:
>>> Publisher.objects.get(name="Apress")
<Publisher: Apress>
如果结果是多个对象,会导致抛出异常:
books.models.MultipleObjectsReturned: get() returned more than one Publisher -- it returned 3!
如果查询没有返回结果也会抛出异常:
books.models.DoesNotExist: Publisher matching query does not exist.
这个 DoesNotExist 异常是 Publisher 这个 model 类的一个属性,即Publisher.DoesNotExist。在你的应用中,你可以捕获并处理这个异常,像这样:
try:
p = Publisher.objects.get(name='Apress')
except Publisher.DoesNotExist:
print("Apress isn't in the database yet.")
else:
print("Apress is in the database.")
4)、数据排列
1、使用 order_by()方法排序 :默认是顺排
>>> Publisher.objects.order_by("name")
<QuerySet [<Publisher: Apress>, <Publisher: Apress Publishing>, <Publisher: O'Reilly>]>
跟以前的 all()例子差不多,SQL 语句里多了指定排序的部分
2、多字段排序 :
>>> Publisher.objects.order_by("state_province", "address")
<QuerySet [<Publisher: Apress>, <Publisher: Apress Publishing>, <Publisher: O'Reilly>]>
3、逆序,在前面加一个减号 - 前缀
>>> Publisher.objects.order_by("-name")
<QuerySet [<Publisher: O'Reilly>, <Publisher: Apress Publishing>, <Publisher: Apress>]>
4、指定模型的缺省排序方式:
在模型中添加 class Meta,指定 ording 的默认排序方式。
5)、连锁查询
通常需要同时进行过滤和排序查询的操作。因此,可以简单地写成这种“链式”的形式:
>>> Publisher.objects.filter(country="U.S.A.").order_by("-name")
<QuerySet [<Publisher: O'Reilly>, <Publisher: Apress Publishing>, <Publisher: Apress>]>
转换成 SQL 查询就是 WHERE 和 ORDER BY 的组合:
SELECT id, name, address, city, state_province, country, website
FROM books_publisher
WHERE country = 'U.S.A'
ORDER BY name DESC;
6)、限制返回的数据
1、显示查询到数据中的第一条:
>>> Publisher.objects.order_by('name')[0]
<Publisher: Apress>
2、切片返回查询到的数据:
>>> Publisher.objects.order_by('name')[0:2]
<QuerySet [<Publisher: Apress>, <Publisher: Apress Publishing>]>
注意:不支持 Python 的负索引(negative slicing):Publisher.objects.order_by('name')[-1]
3、显示查询到的最后一条数据,或者是从后面显示查询的数据
>>> Publisher.objects.order_by('-name')[0]
<Publisher: O'Reilly>
7)、根据规则查询到的数据进行更新
1、使用 save()方法
模型的 save()方法,这个方法会更新一行里的所有列。
>>> p = Publisher.objects.get(name='Apress')
>>> p.name = 'Apress new' >>> p.save()
>>> p <Publisher: Apress new>
这等同于如下 SQL 语句:
SELECT id, name, address, city, state_province, country, website FROM books_publisher WHERE name = 'Apress';
UPDATE books_publisher SET name = 'Apress Publishing', address = '2855 Telegraph Ave.', city = 'Berkeley', state_province = 'CA', country = 'U.S.A.', website = 'http://www.apress.com' WHERE id = 1;
在这个例子里我们可以看到Django 的save()方法更新了不仅仅是name 列的值,还有更新了所有的列。
2、使用 update()方法
更改某一指定的列,我们可以调用结果集(QuerySet)对象的 update()方法:
>>> from books.models import Publisher
>>> Publisher.objects.filter(id=1).update(name='Apress new2')
# 得到的结果是受影响的行数,这里显示的是更新了一条数据
1
>>> Publisher.objects.filter(id=1)
<QuerySet [<Publisher: Apress new2>]>
与之等同的 SQL 语句变得更高效,并且不会引起竞态条件。
UPDATE books_publisher SET name = 'Apress new2' WHERE id = 1;
update()方法对于任何结果集(QuerySet)均有效,可以同时更新多条记录。
4、删除对象:
1、删除数据库中的对象只需调用该对象的 delete()方法即可
>>> p = Publisher.objects.get(name="O'Reilly")
>>> p.delete()
(1, {'books.Publisher': 1})
2、根据过滤查询,将查到的数据删除:
>>> Publisher.objects.filter(name="O'Reilly").delete()
(0, {})