您的位置:首页 > 博客中心 > 数据库 >

Django模型开发 --python数据库连接

时间:2022-03-13 23:44

在Django中,视图负责处理一些业务逻辑,然后返回响应结果。在当代Web应用中,业务逻辑经常牵涉到与数据库的交互,在后台连接数据库服务器,从中取出一些数据,然后在Web页面用漂亮的格式展示这些数据。这个网站也可能会向访问者提供修改数据库数据的方法。

在这一篇博文中,我们将以MySQL数据库为例,先看看不使用Django模型的数据库查询方法,然后开始学习Django的模型。

1. 不使用模型的数据库查询方法

假如我们不采用Django的模型,如何从数据库中获取数据呢?通常的做法就是在视图(View)层中连接数据库,写SQL语句查询数据库,然后把数据渲染给浏览器。在本例的视图中,我们使用了MySQLdb类库(可以从获得)来连接MySQL数据库,取回一些记录,将它们提供给模板以显示一个网页代码看起来像下面这样:

from books.models import Publisher

# 先创建对象,然后再save,相当于SQL中的INSERT
p1 = Publisher(name=‘Apress‘, address=‘2855 Telegraph Avenue‘)
p1.save()
# 注意:尽管我们没有在models给表设置主键,但是Django会自动添加一个id作为主键

# 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
publisher_list = Publisher.objects.all()
for publisher in publisher_list:
    # 对每个publisher做处理

# 修改其中一个字段,再save,相当于SQL中的UPDATE(但这里会更新所有列)
p1.name = ‘Apress Publishing‘
p1.save()
# 如果只需要更新一列,可以用update方法,并应用于结果集上更新多个数据
Publisher.objects.all().update(address=‘USA‘)

# 删除掉数据库中的一行,相当于SQL中的DELETE
p1.delete()

# filter相当于SQL中的WHERE,可设置条件过滤结果
p2 = Publisher.objects.filter(name=‘Apress‘)    #单条件查询
p2 = Publisher.objects.filter(name=‘Apress‘, address__contains=‘Telegraph‘)    # 多条件查询,双下划线表明会进行一些魔术般的操作,contains部分会被翻译成WHERE address LIKE ‘%Telegraph%‘

# 用get来获取单个结果,注意如果没有结果或结果不唯一会抛异常
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."

# 按name字段来排序,相当于SQL中的ORDER BY,如果换成"-name"则是逆序
result = Publisher.objects.order_by("name")

# 上面的方法可以连锁使用
Publisher.objects.filter(country="U.S.A.").order_by("-name")

# 用索引限定数据行数,相当于SQL中的OFFSET 0 LIMIT 2
Publisher.objects.order_by(‘name‘)[0:2]

# 直接通过字段外键来访问数据,这有点类似于SQL中的JOIN
from books.models import Book
publisher_addr = Book.objects.get(id=1).publisher.address

# 对于用"ForeignKey"定义的关系,关系的另一端也能反向追溯回来。通过字段名加_set的方式可以访问到
p = Publisher.objects.get(name=‘Apress Publishing‘)
p.book_set.all()
# 注意到Publisher类里面没有定义book这个字段,但因为定义了外键,Django已经帮我们生成了book_set这个属性

# 多对多和外键工作方式相同,只不过我们处理的是QuerySet而不是模型实例
b = Book.objects.get(id=1).author.all()
# 反向查询还是字段名加_set,例如要查看一个作者的所有书籍
a = Author.objects.get(name=‘Adrian‘)
a.book_set.all()

4. 结语

从上面的介绍可以看到Django的模型已经帮我们干了非常多的事情,比如我们可以通过访问对象的属性和方法来操作数据库,这种技术叫做(ORM,Object Relational Mapping)。本文仅仅介绍了Django模型最基础的部分,其他高级的用法比如增加额外的Manager方法,添加修改数据库字段等应用可以参照。虽然Django给我们提供了如此方便的工具,但它还是需要一定的学习成本的,比如以前你简简单单写个SQL语句就可以搞定的事情,现在要转换为对象的思维,然后去定义模型,学习模型的API。而且听别人说,在涉及到比较复杂的数据库查询和优化的时候,ORM会显得力不从心,所幸Django可以支持原始SQL查询(同样请参见上面的链接)。在日常使用和中小型应用中,使用Django的ORM已经游刃有余,毕竟开发效率才是王道。

热门排行

今日推荐

热门手游