Django:ORM简介与配置

一、Django连接数据库

由于Django自带的SQLite3功能较少,主要用于项目中的小型测试,在实际项目中都会替换成MySQL

1.使用MySQL数据库首先安装驱动程序

pip install PyMySQL
  • Django默认的数据库配置需要我们更新
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}

2.Django配置MySQL

第一步:修改DATABASES配置信息

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day51',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': 'root123',
'CHARSET': 'utf8'
}

第二步:

  • django1.X版本需要在项目目录下或者app目录下的__init__.py编写代码

    让pymysql以MySQLDB的运行模式和Django的ORM对接运行,让Django的ORM能以mysqldb的方式来调用PyMySQL。

import pymysql
pymysql.install_as_MySQLdb()
  • django2.X及以上都可以直接通过下载mysqlclient模块解决

终端中执行

pip install mysqlclient

3.查看执行的SQL语句的配置

如果想在创建表的时候查看执行的SQL语句,可以在settings.py中添加

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level': 'DEBUG',
},
}
}

二、ORM简介

1.ORM:对象关系映射

ORM的作用简单来说是Django中自带的,能够让不会SQL语句的python程序员,使用python面向对象的语法来操作数据库的一种方式

Pyhton 映射数据库中
对象 记录
对象点属性 数据获取字段对应的值

ORM缺点:

ORM由于高度封装了SQL语句,所以运行效率较低

  • 我们可以通过以下步骤来使用django的数据库操作:
  1. 配置数据库连接信息
  2. 在models.py中定义模型类
  3. 生成数据库迁移文件并执行迁文件[注意:数据迁移是一个独立的功能,这个功能在其他web框架未必和ORM一块的]
  4. 通过模型类对象提供的方法或属性完成数据表的增删改查操作

2.ORM基本操作

1.先在models.py中编写模型类

# ORM object relationship mapping 模型类
class BoysInfo(models.Model):
# id int primary key auto_increment
id = models.AutoField(primary_key=True) # 字段名=字段类型 + 约束条件
# name varchar(32)
name = models.CharField(max_length=32)
# age int
age = models.IntegerField()

2.执行数据库迁移相关命令

  • 在终端中,将操作记录在migrations目录下,之后就可以操作了
python3 manage.py makemigrations

image-20221209120426511

image-20221209120407881

  • 将数据库迁移到数据库中
python3 manage.py migrate
image-20221209120707771

每次执行相关数据库的操作,都需要执行这两条命令同步数据库

3.ORM基本语句

使用ORM需要在views.py文件中导入models

from app01 import models
  • 创建表

    models.类名.objects.create()
  • 创建表

    models.类名.objects.filter()
  • 创建表

    models.类名.objects.update()
  • 创建表

    models.类名.objects.delete()

报错信息记录

1.name '_mysql' is not defined

image-20221209115345320

  • 解决方案:在__init__.py中添加
import pymysql
pymysql.install_as_MySQLdb()
  1. 'str' object has no attribute 'decode'

image-20221209115503445

  • 解决方案:点进去链接,将decode改成encode

image-20221209115525611

4.Model相关的概念与使用方法

Model的组成部分

每个Model都是一个Python类,且通常会包含四个部分:继承自django.db.models.Model、Model元数据声明(Meta内部类)、若干个Field类型的字段以及__str__方法

Meta元数据类属性说明

Meta类用于定义Model的元数据,即不属于Model的字段,但是可以用来标识它的一些属性

abstract:

一个布尔类型的变量,如果设置为True,则标识当前的Model是抽象基类,这个元选项不具有传递性,只对当前声明的类有效。例如,对于之前定义的BaseModel,用abstract声明为抽象基类,但是子类Topic和Comment不受影响

db_table:

这个字段用于指定数据表的名称

默认会使用Django的表名生成规则,例如Topic会映射到post_topic表。如果想让Topic映射到topic表,定义db_table='topic'即可

ordering:

用于指定获取对象列表时的排序规则

按照created_time逆序排序,可以定义:

ordering = ['-created_time']
1
先按照created_time逆序排序,再按照last_modified正序排序:

ordering = ['-created_time', 'last_modified']
1
indexes:

它是一个列表类型的元选项,用来定义Model的索引

fields:一个列表对象,用于指定索引的字段,是必填项,且至少包含一个字段。
name:用于标识索引的名称,是可选的,如果不提供,Django会根据不同的数据库生成合适的索引名。
db_tablespace:表空间,也是可选的,常见于PostgreSQL、Oracle数据库,用于优化数据库性能
unique_together:

标识联合唯一约束,在数据库层面表现为联合唯一索引

Field的通用字段选项
blank:

对于任何一个属性,默认是不允许输入空值的,如果允许这种情况发生,需要设置blank=True

unique:

如果一个字段设置了unique=True,则表示唯一性索引

null:

规定这个字段的数据是否可以是空值

db_index:

如果该字段经常作为查询的条件,那么就需要考虑设置db_index选项,以加快数据的检索速度

default:

用于给字段设置默认值

choices:

设置了choices的字段在管理后台的显示上会由文本框变成选择框,选择框中的可选值就是choices中的元组

help_text:

这个选项用于在表单中显示字段的提示信息。例如在管理后台的编辑页面,对应在字段输入框的下方会显示该选项设定的值

posted @   Duosg  阅读(195)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示