热门标签 | 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









推荐阅读
  • Django xAdmin 使用指南(第一部分)
    本文介绍如何在Django项目中集成和使用xAdmin,这是一个增强版的管理界面,提供了比Django默认admin更多的功能。文中详细描述了集成步骤及配置方法。 ... [详细]
  • 本文详细探讨了 Django 的 ORM(对象关系映射)机制,重点介绍了其如何通过 Python 元类技术实现数据库表与 Python 类的映射。此外,文章还分析了 Django 中各种字段类型的继承结构及其与数据库数据类型的对应关系。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • Django Token 认证详解与 HTTP 401、403 状态码的区别
    本文详细介绍了如何在 Django 中配置和使用 Token 认证,并解释了 HTTP 401 和 HTTP 403 状态码的区别。通过具体的代码示例,帮助开发者理解认证机制及权限控制。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
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社区 版权所有