django5个人笔记
django概述
django一开始是做新闻网站的主要是为了提高开发效率主要是实现简单快捷的网站开发,下面我们聊聊它的设计原理。
MTV架构(Model,template,view即模型,模板视图)
1.model
定义数据库结构和数据库交互,基本数据库配置写在setting.py里面
每个模型都是一个 Python 的类,这些类继承 django.db.models.Model
每个模型对应一张数据表通过djangoORM进行抽象访问
其中再model文件里
一个模型类 = 一张表
一个类属性(字段) = 表里的一个列
一条模型实例 = 表里的一行记录
比如我们构建一个简易的user模型
#app名/models.py
form django.db import models
class User(model.Model):username = models.CharField("用户名",max_length=150,unique= True)email = models.EmailField("用户名",max_length=150,unique=True)age = models.PositiveSmailIntegeried('年龄',null = True)join_at = models.DataTimeField('注册时间',auto_now_add=True)class Meta:db_table = "tb_users"ordering = ['-join_at']verbose_name = '用户'verbose_name_plural ="用户"def _str(self):return self.username
我们执行
python manage.py makemigrations #生成迁移文件
python manage.py migrate #应用迁移
后就会生成一张表
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
id | int(10) unsigned | NO | PRI | NULL | auto_increment |
username | varchar(150) | NO | UNI | NULL | |
varchar(254) | YES | NULL | |||
age | smallint(5) | YES | NULL | ||
join_at | datetime(6) |
注意
你没写 id 字段,Django 会自动给你加主键自增字段,除非自己指定 primary_key=True。
字段类型与真正数据库类型的映射由“路由”决定(MySQL、PostgreSQL、SQLite 各不相同)
常用字段类型和常用参数
场景 | 推荐字段 | 关键参数 |
---|---|---|
字符串 | CharField / TextField | max_length(CharField 必须)、db_index、choices |
整数 | IntegerField / PositiveIntegerField / BigAutoField | default、validators |
小数 | DecimalField(max_digits, decimal_places) | 金额、汇率必备 |
真假 | BooleanField | null 别用,老版本有坑 |
时间 | DateTimeField / DateField / TimeField | auto_now(更新时自动变)、auto_now_add(创建时自动变) |
文件 | FileField / ImageField | upload_to、storage(可接 OSS/S3) |
枚举 | IntegerField + choices | 比字符串省空间,可全球统一 |
JSON | JSONField(Django 3.1+ 内置) | 存结构化扩展字段,PostgreSQL 原生,MySQL 5.7+ 也支持 |
通用字段参数:
null=True # 数据库层面允许 NULL
blank=True # 表单层面允许空
db_index=True # 给该列建普通索引
unique=True / together_unique=(“f1”,“f2”) # 唯一约束
default / choices / validators / help_text / editable / verbose_name
模型层 CRUD 接口(增删改查操作)
我们先笼统讲一下模型层 CRUD 接口
Django 5 的“模型层 CRUD 接口”就是:
在 Django 5 的 ORM 框架里,每个模型类(继承自 models.Model)自带的 objects 管理器所提供的一整套“增删改查”方法集合。开发者直接调用这些 Python 方法即可完成对数据库表的 CRUD 操作,而不需要手写 SQL。
增
u = User.object.create(username='alice',email = 'alice@ex.com')
#或者
u = User(username='alice',email="alice@ex.com")
u.save()
查
# 链式过滤器(惰性,真正用到数据才发 SQL)
qs = User.objects.filter(age__gte=18).exclude(email="").order_by("-join_at")
for u in qs:print(u.username, u.email)# 常用查询运算符
# __exact __iexact __contains __icontains __startswith __gt __gte __lt __lte __range __in __isnull
# 时间字段还有 __year __month __day __hour ...# 只拿一条
try:u = User.objects.get(username="alice")
except User.DoesNotExist:...
改
#单条改
u.age = 19
u.sava()
#批量改
user.objects.filter(age__isnull=True).update(age=0)
删
u.delete()#单条
User.objects.filter(spam=true).delete()#批量