热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:Django数据库操作

本文由编程笔记#小编为大家整理,主要介绍了Django数据库操作相关的知识,希望对你有一定的参考价值。1ORM概述ORM(Ob
本文由编程笔记#小编为大家整理,主要介绍了Django数据库操作相关的知识,希望对你有一定的参考价值。



1 ORM概述

ORM(Object Relational Mapping)对象关系映射,是一种程序计数,用于实现面向对象编程语言里不同类型系统的数据之间的转换


2 Django项目连接mysql数据库

Django连接mysql数据库的操作,是通过根模块的配置实现的,在项目模块的配置文件settings.py中,我们可以查询到如下默认配置


DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "django_test",
"HOST": "localhost",
"PORT": 3306,
"USER": "root",
"PASSWORD": "******",
"CHARSET": "utf8"
}
}

如此,Django和数据库之间的连接关系就建立了


3 定义创建模块


3.1 在Django项目中定义模型数据,其实将组成定义class类型,通过类型创建的对象来封装和管理数据,一定要在这里明确关联和对应关系。























程序数据库
class类型table表格
attribute属性field字段
object对象record记录或者行


3.2 有了对应关系之后,我们要创建的模型对象的属性必须和数据库中的字段类型对应起来。



































































对象中的数据类型定义表中的字段类型
AutoField()auto_increment 自动增长,一般主键
BooleanField()bool 布尔类型
NullBooleanField()bool or null 扩展布尔类型
CharField()varchar 字符串
TextField()text 长文本
IntegerFieldint 整数
DecimalField()double 高精度浮点数
FloatField()float 单精度浮点数
DateField()date 日期
TimeField()time 时间
DateField()date 日期时间
FileField()datetime 日期时间
FileField()blob 二进制
ImageField()blob 二进制


3.3 每个字段定义是,都会有自己的一些特殊的选项指定







































选项描述
null如果为True,将NULL空值存储到数据库中,默认False
blank如果为True,表示该字段允许存储空值,默认False
db_column字段名称,如果不指定,直接使用类型属性的名称作为字段名称
db_index如果设置为True,表示给当前字段添加索引支持
default给字段设置默认值
primary_key是否设置当前字段为主键
unique如果为True,该字段中存储的值必须是唯一的


3.4 在大部分项目中,还会涉及到多表关联操作:























选项描述
ForeignKey一对多关联关系,该字段定义在多的一方
ManyToManyField多对多关联关系,该字段两方都需要定义
OneToOneField一对一关联关系,该字段可以定义在任意一方


3.5 在blog模块下的models.py文件中创建对应的类

from django.db import models
class User(models.Model):
id = models.AutoField(primary_key=True, verbose_name="用户编号")
user_name = models.CharField(max_length=50, verbose_name="用户姓名")
user_password = models.CharField(max_length=50, verbose_name="密码")
user_age = models.IntegerField(verbose_name="用户年龄")
user_address = models.CharField(max_length=100, verbose_name="用户地址")
def __str__(self):
return self.user_name

4 数据库同步操作


4.1 执行如下命令

python manage.py makemigrations


4.2 查看生成的sql语句

python manage.py sqlmigrate [app_name] [number]


4.3 自动同步数据库

python manage.py migrate


5 模型操作--增删改查

Django为大家提供了如下几种操作方式
* 类方法操作方式(了解)
* 类管理器操作方式(重要-面向对象的操作方式)
* 对象属性的操作方式(重要-面向过程的操作方式)
增加直接调用Model类中的save方法,删除则调用delete方法


5.1 类方法操作方式(了解)

修改模型定义类,创建一个静态的对象创建方法。

from django.db import models
class User(models.Model):
id = models.AutoField(primary_key=True, verbose_name="用户编号")
user_name = models.CharField(max_length=50, verbose_name="用户姓名")
user_password = models.CharField(max_length=50, verbose_name="密码")
user_age = models.IntegerField(verbose_name="用户年龄")
user_address = models.CharField(max_length=100, verbose_name="用户地址")
@classmethod
def create(cls, user_name, user_password, user_age=user_age, user_address=user_address):
user = cls(user_name=user_name, user_password=user_password, user_age=user_age, user_address = user_address)
return user

重新定义views.py中的处理函数

def register(request):
user = models.User.create("tom", "**", "12", "zz")
# 保存对象
user.save()
return HttpResponse("

用户注册成功!

")

然后配置路由,查看数据库,发现用户已经注册成功


5.2 类管理操作方式

在models.py文件中创建一个类型,这个是对应model模型类的管理器类型,如User类的管理器UserManager

class UserManager(models.Manager):
def add(self, user_name, user_password, user_age, user_address):
# 调用Manager类的create方法
user = self.create(user_name=user_name, user_password=user_password, user_age=user_age, user_address=user_address)
return user

# 用户类
# Django中的数据模型必须继承Model类
class User(models.Model):
id = models.AutoField(primary_key=True, verbose_name="用户编号")
user_name = models.CharField(max_length=50, verbose_name="用户姓名")
user_password = models.CharField(max_length=50, verbose_name="密码")
user_age = models.IntegerField(verbose_name="用户年龄")
user_address = models.CharField(max_length=100, verbose_name="用户地址")

# 用户管理器对象
user_manager = UserManager()

之后在views.py视图函数中直接调用User对象的user_manager对象的add方法完成即可

def register(request):
# 第二种方式,类管理方式
user = models.User.user_manager.add("tom", "**", "12", "zz")
return HttpResponse("

用户注册成功

")

第二种方式是基于面向对象方式完成,为每一个model模型类构建一个管理器对象,这种方式更符合面向对象的编程,将组成将对自身的各种操作,交给一个管理器完成,model模型类只是定义属性即可,而自身不会参加操作,推荐使用


5.3 对象属性操作方式

实质我们的model类已经继承Model这个类,根据第一种方式,我们知道Model类中存在一个save方法,所以我们也可以直接构建对象,使用这个方法文成操作。
models.py不需要任何操作,只在views.py文件中构建对象,完成保存即可。

def register(request):
user = models.User("tom", "**", "12", "zz")
user.save()

return HttpResponse("

用户注册成功!!

")

6 查询操作

Django提供了一个shell测试命令行进行处理
python manage.py shell


6.1 查询多条数据

* all() 查询全部数据
* filter([condition])查询指定条件数据,如果没有指定条件,等同于all()
* exclude([condition])查询指定条件之外的数据,如果没有指定条件,等同于all()
* order_by()根据指定的字段进行排序查询,字段前面添加符号"-"表示倒序
* values()将查询到的数据转换成字典,保存在列表中返回

all(), filter(), exclude()查询返回的数据是QuerySet,不支持倒序索引


6.2 查询一条数据

* get([conditon])查询指定条件的数据,返回0条或者多条都会出现异常
* count()返回查询到的结果的总数
* first()返回查询到的第一条数据
* last()返回查询到的最后一条数据
* existe()判断查询结果中是否包含数据

get和filter方法的区别:
* get获取的是一个对象,而filter获取的是一个列表
* get如果获取不到值,则报错,而filter会返回一个空列表


6.3 条件查询

* 相等条件查询 key=value
* 包含条件查询 key__cOntains=value:模糊查询(like)
* 开头结尾查询 key__startswith=value, key__endswith=value
* 是否为空查询 key__isnull=True, key__isnotnull=True
* 范围查询 key__in=[1, 2, 3, 4]
* 关系查询
* key__gt=1 大于1 grant than
* key__gte=1 大于等于1 grant than or equals
* key__lt=1 小于1
* key__lte=1 小于等于1
* 日期查询
key__year=2017









推荐阅读
  • PHP中元素的计量单位是什么? ... [详细]
  • 池子比率:BSV 区块链上的去中心化金融应用——Uniswap 分析
    池子比率:BSV 区块链上的去中心化金融应用——Uniswap 分析 ... [详细]
  • 深入解析 Django 中用户模型的自定义方法与技巧 ... [详细]
  • 从无到有,构建个人专属的操作系统解决方案
    操作系统(OS)被誉为程序员的三大浪漫之一,常被比喻为计算机的灵魂、大脑、内核和基石,其重要性不言而喻。本文将详细介绍如何从零开始构建个人专属的操作系统解决方案,涵盖从需求分析到系统设计、开发与测试的全过程,帮助读者深入理解操作系统的本质与实现方法。 ... [详细]
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
  • 本文深入探讨了数据库性能优化与管理策略,通过实例分析和理论研究,详细阐述了如何有效提升数据库系统的响应速度和处理能力。文章首先介绍了数据库性能优化的基本原则和常用技术,包括索引优化、查询优化和存储管理等。接着,结合实际应用场景,讨论了如何利用容器化技术(如Docker)来部署和管理数据库,以提高系统的可扩展性和稳定性。最后,文章还提供了具体的配置示例和最佳实践,帮助读者在实际工作中更好地应用这些策略。 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • DHCP三层交换机设置方式全局模式和接口模式设置方式和命令resetsave回车输入yreboot输入n输入y重启后就恢复默认设置了默认用户名密码adminAdmin@huawei ... [详细]
  • Java服务问题快速定位与解决策略全面指南 ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • Java 零基础入门:SQL Server 学习笔记(第21篇)
    Java 零基础入门:SQL Server 学习笔记(第21篇) ... [详细]
  • MySQL索引机制解析及其典型应用挑战
    本文深入解析了MySQL索引机制,并探讨了其在实际应用中的典型挑战。首先,介绍了数据库中常用的慢查询优化方法——添加索引。接着,详细解释了索引为何能够显著提升查询性能,尤其是通过其作为高效数据检索结构的作用,如B树索引在MySQL中的应用。此外,文章还讨论了索引设计时需要考虑的因素,以及不当使用索引可能带来的负面影响。 ... [详细]
  • 在Python编程中,掌握高级技巧对于提升代码效率和可读性至关重要。本文重点探讨了生成器和迭代器的应用,这两种工具不仅能够优化内存使用,还能简化复杂数据处理流程。生成器通过按需生成数据,避免了大量数据加载对内存的占用,而迭代器则提供了一种优雅的方式来遍历集合对象。此外,文章还深入解析了这些高级特性的实际应用场景,帮助读者更好地理解和运用这些技术。 ... [详细]
author-avatar
醣荳_448
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有