Django数据库操作

Posted chenliang0309

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 长文本
IntegerField int 整数
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("<h1>用户注册成功!</h1>")

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

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("<h1>用户注册成功</h1>")

第二种方式是基于面向对象方式完成,为每一个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("<h1>用户注册成功!!</h1>")

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数据库操作的主要内容,如果未能解决你的问题,请参考以下文章

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段

Django REST框架--认证和权限

如何在 Django 中显式重置模板片段缓存?

使用 Django 模板作为片段

VSCode自定义代码片段——git命令操作一个完整流程

python 通过django片段很多很多