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的解决办法(转)(代码片段