Django ORM 的基本常用操作——创建数据、查询数据

4 篇文章 0 订阅
3 篇文章 0 订阅

ORM简介:
        全称是对象关系映射(Object-Relational Mapping),它是一种编程技术,用于将对象模型和关系数据库之间的数据进行映射和转换。通过使用ORM,开发人员可以使用面向对象的方式来操作数据库,而不需要直接编写SQL语句。ORM框架通常会提供一系列工具和方法,用于简化数据库操作,提高开发效率,并减少代码重复。常见的ORM框架包括Hibernate、Entity Framework、Django ORM等。ORM的主要优点包括提高开发效率、减少代码量、降低数据库平台的依赖性等。

        ORM的基本操作包括增删改查(CRUD):增加(Create)、读取查询(Read)、更新(Update)和删除(Delete)。

ORM CRUD的核心 - >模型类.管理器对象

管理器对象:每个继承自models.Model的模型类,都会有一个objects对象被同样继承下来,这个对象就叫做管理器对象。数据库的增删改查可以通过模型的管理器实现管理。

class MyModel(models.Model):
    ...    

MyModel.objects.create(...)   # objects是管理器对象   

1.创建数据

Django ORM 使用一种直观的方法把数据库表中的数据表示成Python对象

创建每一条数据就是创建一个python的数据对象

方法1:

MyModel.objects.create(属性1=值1,属性2=值2,...)

成功:返回创建好的实体对象

失败:抛出异常

方法2:

obj = MyModel(属性1=值1,属性2=值2,...)

obj.属性=值

obj.save()  # 注意:只有当用户调用了save()方法数据才会正真地被存入数据库

例子:

from bookstore.models import Book  # 导入模型类

插入数据的两种方法:
方法一:
b1 = Book.objects.create(title='Python',price=20,pub='清华大学出版社',market_price=25)

方法二:
b2 = Book(title='Redis',price=20,pub='机械工业出版社',market_price=100)
b2.save()

2.查询数据

数据库的查询需要使用管理器对象进行

通过MyModel.objects管理器方法调用查询方法

方法说明
all()查询全部记录,返回Query Set查询对象
get()查询符合条件的单一记录
filter()查询符合条件的多条记录
exclude()查询符合条件之外的所有记录

1.all()方法

        用法:MyModel.objects.all()

        作用:查询MyModel实体中所有的数据

        等同于: SELECT * FROM table

        返回值:QuerySet容器对象(类似于数组),内部存放MyModel实例(对象)

例子:

from bookstore.models import Book  # 导入模型类

a1 = Book.objects.all()

a1为:<QuerySet [<Book: Book object (1)>, <Book: Book object (2)>]>  可以看出是一个QuerySet 对象

for b in a:   # 可以遍历该对象容器,然后访问每个对象的属性
     print(b.title)  
输出:python C++

 当我们打印输出这个对象容器时,我们会发现输出的内容是这样的(视乎数据显示不全):

<QuerySet [<Book: Book object (1)>,<Book: Book object (2)>]>

想要修改其输出内容的话,我们需要在模型类中定义方法__str__,自定义QuerySet中的输出格式。例如 :

def __str__(self):
        return '{}---{}---{}---{}'.format(self.title, self.price, self.market_price, self.pub)

输出结果:<QuerySet [<Book: python---20.00---100.00---清华大学出版社>]> 

2.values('列1','列2')方法

        用法:MyModel.objects.values(...)

        作用:查询部分列的数据并返回

        等同于:SELECT 列1,列2 FROM xxx

        返回值:QuerySet

                返回查询结果容器,容器内存字典,每个字典代表一条数据,

                格式为:{'列1':'值1','列2':'值2'}

例子:

a2 = Book.objects.values('title','pub')
# 等同于:
SELECT `book`.`title` FROM `book`
输出:
<QuerySet [{'title': 'python', 'pub': '清华大学出版社'}, {'title': 'C++', 'pub': '北京大学出版社'}]>

按字段取数据:
for i in a2:
     print(i['title']) 
输出:
python
C++

3.values_list()方法

        用法:MyModel.objects.values_list(...)

        作用:返回值为元组的查询结果

        等同于:SELECT 列1,列2 FROM xxx

        返回值:QuerySet容器对象,内部存放‘元组’,会将查询出来的数据封装到元组中,在封装到查询集合QuerySet中

例子:

c = Book.objects.values_list('title')  # 返回的是元组
# 等同于:
SELECT `book`.`title` FROM `book`
#输出:
<QuerySet [('Python',), ('Redis',), ('Django',), ('C++',), ('JAVA',)]>

for book in c:
     print(book[0])
# 输出: 
Python
Redis
Django
C++
JAVA

4. order_by()方法

          用法:MyModel.objects.order_by(...)

          作用:与all()方法不同,它用SQL语句的ORDER BY子句对查询结果进行根据某个字段选择性的进行排序

          说明:默认按升序排序,降序排序则需要在列前增加‘-’表示倒序

    例子:

d = Book.objects.order_by('price')  # 默认是升序查询,'-price'为降序查询

#等同于:
SELECT `book`.`id`, `book`.`title`, `book`.`price`, `book`.`pub`, `book`.`market_price` FROM `book` ORDER BY `book`.`price` ASC

# 输出:
<QuerySet [<Book: C++__10.00__清华大学出版社__75.00>, <Book: Python__20.00__清华大学出版社__25.00>, <Book: Redis__20.00__机械工业出版社__100.00>, <Book: Django__70.00__机械工业出版社__75.00>, <Book: JAVA__100.00__清华大学出版社__125.00>]>




# 可以与其他的查看连用,而且顺序无所谓
e = Book.objects.values('title').order_by('market_price')

# 等同于:
SELECT `book`.`title` FROM `book` ORDER BY `book`.`market_price` ASC

# 输出:
<QuerySet [{'title': 'Python'}, {'title': 'Django'}, {'title': 'C++'}, {'title': 'Redis'}, {'title': 'JAVA'}]>

5. filter()方法

        语法:MyModel.objects.filter(属性1=值1,属性2=值2)

        作用:返回包含此条件的全部数据集

        返回值:QuerySet容器对象,内存放MyModel实例

        说明:当多个属性在一起时为‘与’关系

例子:

books = Book.objects.filter(pub='清华大学出版社')

等同于:
SELECT `book`.`id`, `book`.`title`, `book`.`price`, `book`.`pub`, `book`.`market_price` FROM `book` WHERE `book`.`pub` = 清华大学出版社


输出:
<QuerySet [<Book: python---20.00---100.00---清华大学出版社>]>

for book in books:
     print('书名',book.title)
输出: 
书名 python

6.get()方法

        语法:MyModel.objects.get(条件)

        作用:返回满足条件的唯一数据

        说明:该方法只能返回一条数据,查询到多条数据时则异常抛出(Model.MultipleObjectsReturned)异常。查询没有数据结果则抛出Model.DoesNotExist异常。

例子:

bk = Book.objects.get(title='Java')  # 查询不存在的数据
输出报错:
bookstore.models.DoesNotExist: Book matching query does not exist.


bk = Book.objects.get(title='Python')
输出:
<Book: python---20.00---100.00---清华大学出版社>


非等值查询:

查询谓词:

定义:做更灵活的查询条件时需要使用查询谓词

说明:每个查询谓词是一个独立的查询功能

1. __exact:等值匹配

例子:

book = Book.objects.fliter(id__exact=1)
等同于:
SELECT * FROM xxx WHERE id = 1
输出:
<Book: python---20.00---100.00---清华大学出版社>

2. __contains:包含指定值 (模糊搜索)

例子:

ok = Book.objects.filter(title__contains='y')
等同于:
SELECT * FROM xxx WHERE title like '%w%'
输出:
<QuerySet [<Book: python---20.00---100.00---清华大学出版社>]>

3. __startswith: 以xxx开始

4.__ebdswith:以xxx结束

5.__gt:大于指定值

test = Book.objects.filter(price__gt=1)
等同于:
SELECT `book`.`id`, `book`.`title`, `book`.`price`, `book`.`pub`, `book`.`market_price` FROM `book` WHERE `book`.`price` > 1
输出:
<QuerySet [<Book: python---20.00---100.00---清华大学出版社>, <Book: C++---30.00---1000.00---北京大学出版社>]>


6.__gte:大于等于

7.__lt:小于

8.__lte:小于等于

9.__in:查询数据是否在指定范围内

 ls = Book.objects.filter(title__in=['Python','Java', 'C++'])

等同于:
SELECT `book`.`id`, `book`.`title`, `book`.`price`, `book`.`pub`, `book`.`market_price` FROM `book` WHERE `book`.`title` IN (Python, Java, C++)

输出:
<QuerySet [<Book: python---20.00---100.00---清华大学出版社>, <Book: C++---30.00---1000.00---北京大学出版社>]>
for l in ls:
     print(l)

输出: 
python---20.00---100.00---清华大学出版社
C++---30.00---1000.00---北京大学出版社

10.__range:查找数据是否在指定的区间范围内

t = Book.objects.filter(price__range=(10,10000))
等同于:
SELECT `book`.`id`, `book`.`title`, `book`.`price`, `book`.`pub`, `book`.`market_price` FROM `book` WHERE `book`.`price` BETWEEN 10 AND 10000

输出:
<QuerySet [<Book: python---20.00---100.00---清华大学出版社>, <Book: C++---30.00---1000.00---北京大学出版社>, <Book: Redis---90.00---100.00---机械出版社>]>


篇幅过长,ORM更新数据以及删除数据放到下一篇:

http://t.csdnimg.cn/Sb1Aficon-default.png?t=N7T8http://t.csdnimg.cn/Sb1Af
更多信息可以参考官网:https://docs.djangoproject.com/en/2.2/ref/models/querysets/#fi eld-lookups

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值