ORM简介:
全称是对象关系映射(Object-Relational Mapping),它是一种编程技术,用于将对象模型和关系数据库之间的数据进行映射和转换。通过使用ORM,开发人员可以使用面向对象的方式来操作数据库,而不需要直接编写SQL语句。ORM框架通常会提供一系列工具和方法,用于简化数据库操作,提高开发效率,并减少代码重复。常见的ORM框架包括Hibernate、Entity Framework、Django ORM等。ORM的主要优点包括提高开发效率、减少代码量、降低数据库平台的依赖性等。
ORM的基本操作包括增删改查(CRUD):增加(Create)、读取查询(Read)、更新(Update)和删除(Delete)。
管理器对象:每个继承自models.Model的模型类,都会有一个objects对象被同样继承下来,这个对象就叫做管理器对象。数据库的增删改查可以通过模型的管理器实现管理。
class MyModel(models.Model):
...
MyModel.objects.create(...) # objects是管理器对象
1.创建数据
Django ORM 使用一种直观的方法把数据库表中的数据表示成Python对象
方法1:
MyModel.objects.create(属性1=值1,属性2=值2,…)
方法2:
obj = MyModel(属性1=值1,属性2=值2,…)
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.查询数据
方法 | 说明 |
all() | 查询全部记录,返回Query Set查询对象 |
get() | 查询符合条件的单一记录 |
filter() | 查询符合条件的多条记录 |
exclude() | 查询符合条件之外的所有记录 |
等同于: 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’)方法
等同于:SELECT 列1,列2 FROM xxx
格式为:{‘列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++
用法: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
用法: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)
说明:当多个属性在一起时为‘与’关系
例子:
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()方法
说明:该方法只能返回一条数据,查询到多条数据时则异常抛出(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---清华大学出版社>
非等值查询:
查询谓词:
例子:
book = Book.objects.fliter(id__exact=1)
等同于:
SELECT * FROM xxx WHERE id = 1
输出:
<Book: python---20.00---100.00---清华大学出版社>
例子:
ok = Book.objects.filter(title__contains='y')
等同于:
SELECT * FROM xxx WHERE title like '%w%'
输出:
<QuerySet [<Book: python---20.00---100.00---清华大学出版社>]>
3. __startswith: 以xxx开始
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:小于
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---北京大学出版社
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---机械出版社>]>
http://t.csdnimg.cn/Sb1Afhttp://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进行投诉反馈,一经查实,立即删除!