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)&gt;, <Book: Book object (2)&gt;]&gt;  可以看出是一个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

原文地址:https://blog.csdn.net/m0_74139794/article/details/134084364

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_41048.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注