django框架——模型层 models.py
模型层 models.py
ORM 对象关系映射
类 表
对象 记录
对象属性 记录某个字段对应的值
迁移命令
python3 manage.py makemigrations 将操作记录记录到migrations文件夹
python3 manage.py migrate 将操作真正的同步到数据库中
orm字段
id int primary_key auto_increment
一张表中必须要有一个主键字段 ;不定义 orm自动创建主键字段
AutoField(primary_key=True)
CharField 必须要指定max_length参数
IntegerField
BigIntegerField bigint
DecimalField
max_digits=8
decimal_places=2
EmailFiled varchar(254)
DateField
DateTimeField
auto_now:更新时间
auto_now_add:创建时间
BooleanField(Field)
字段传布尔值(False/True) 数据库里面存0/1
TextField 没有字数限制
FileField
upload_to = "/data"
将文件保存到/data目录下,将文件路径保存到数据库中
参数:
verbose_name 字段的解释
help_text='这里填书名'
on_delete=models.DO_NOTHING
db_constraint=False 逻辑上的关联,实质上没有外键连接,增删不会受外键影响,但是orm查询不影响
参考博客:https://www.cnblogs.com/Dominic-Ji/p/9203990.html
ForeignKey(unique=True) === OneToOneField()
db_index
db_index=True 字段设置索引
to_field
设置要关联的表的字段 默认不写关联的就是另外一张的主键字段
on_delete
django2.X及以上版本 需要指定外键字段的级联更新级联删除
表断关联
表之间没有外键关联,但是有外键逻辑关联(有充当外键的字段)
断关联后不会影响数据库查询效率,但是会极大提高数据库增删改效率(不影响增删改查操作)
断关联一定要通过逻辑保证表之间数据的安全,不要出现脏数据,代码控制
级联关系
models.CASCADE
models.DO_NOTHING
models.SET_NULL
models.SET_DEFAULT
自定义字段
class MyCharField(models.Field):
def __init__(self,max_length,*args,**kwargs):
self.max_length = max_length
# 调用父类的init方法
super().__init__(max_length=max_length,*args,**kwargs)
# 一定要是关键字的形式传入
def db_type(self, connection):
"""
返回真正的数据类型及各种约束条件
"""
return 'char(%s)'%self.max_length
抽象表——公共字段
from django.contrib.auth.models import AbstractUser
class Meta:
abstract=True # 抽象表,不再数据库建立出表
class Meta:
verbose_name_plural='书表' # admin中表名的显示
def __str__(self): # 网页上显示的对象名称
return self.name
choices参数(数据库字段设计常见)
字段类型 与 1,2,3 类型一致
gender_choices = (
(1,'男'),
(2,'女'),
(3,'其他'),
)
gender = models.IntegerField(choices=gender_choices)
get_字段名_display()
user_obj = models.User.objects.filter(pk=1).first()
print(user_obj.get_gender_display())
字段的增删改查
# 字段的增加
1.可以在终端内直接给出默认值
2.该字段可以为空
null=True
3.直接给字段设置默认值
default='study'
修改,删除后执行迁移命令即可
注意:字段没了,数据都删除了!!!
数据的增删改查
# 查
res = models.User.objects.filter(username=username)
不支持负数索引
user_obj = models.User.objects.filter(username=username).first()
# 查询出用户表里面所有的数据
data = models.User.objects.filter()
user_queryset = models.User.objects.all()
# 增
res = models.User.objects.create(username=username,password=password)
user_obj = models.User(username=username,password=password)
user_obj.save()
# 改
models.User.objects.filter(id=edit_id).update(username=username,password=password)
批量更新操作,只修改被修改的字段
edit_obj.username = username
edit_obj.password= password
edit_obj.save()
所有字段全部更新 无论该字段是否被修改
# 删 给数据添加 is_delete 字段,表示是否删除
models.User.objects.filter(id=delete_id).delete()
# obj 必须将filter.first() 赋值给 obj 然后对obj进行操作,如下不行。
# 每次取出的都是之前的对象,没变。最后一条,取出来再 save。。。
obj = models.Book.objects.filter(id=id).first()
models.Book.objects.filter(id=id).first().book_name=book_name
models.Book.objects.filter(id=id).first().price=price
models.Book.objects.filter(id=id).first().save()
django orm中如何创建表关系
在django1.X版本中外键默认级联更新删除
外键字段建在多的一方,查询频率高的一方
一对多
models.ForeignKey(to='关联表名')
models.ForeignKey(to=关联表名) 关联表名必须出现在上方
自动加id
一对一
models.OneToOneField(to='关联表名')
自动加id
多对多
models.ManyToManyField(to='关联表名')
多对多三种创建方式
# 全自动:orm自动创建第三张关系表
优点:非常的方便 支持orm提供操作第三张关系表的方法
不足之处:没有办法额外添加字段
# 纯手动
class Book(models.Model):
name = models.CharField(max_length=32)
class Author(models.Model):
name = models.CharField(max_length=32)
class Book2Author(models.Model):
book_id = models.ForeignKey(to='Book')
author_id = models.ForeignKey(to='Author')
优点:第三张表能添加字段
不足之处:不能够再使用orm提供的简单的方法
不建议用该方式
# 半自动
class Book(models.Model):
name = models.CharField(max_length=32)
authors = models.ManyToManyField(to='Author',
through='Book2Author',
through_fields=('book','author')
)
class Author(models.Model):
name = models.CharField(max_length=32)
class Book2Author(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Author')
through_fields字段先后顺序:主动表,被动表
半自动:可以使用orm的正反向查询 但是没法使用add,set,remove,clear这四个方法
一般都会采用半自动
分类:
Django
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现