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.name1、增加数据:
>>> 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, {})