Django中ORM模型操作

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, {})

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值