ORM——类&对象操作
创建一个表(ORM中就是创建一个类)
- 前提是需要进行mysql数据库的配置:请见:数据库配置
- 通常设置在models.py中
- 下面将举例创建一个表,表头有username和passowrd两个值。
- 使用models模块来进行对数据库的操作用来和mysql进行交互的模块。
- 在models.py进行mysql数据交互的配置
from django.db import models
class user(models.Model): #继承父类
username = models.CharField(max_length=32) #创建一个名为suername的表头,设置值为varchar(32)
password = models.CharField(max_length=32) #创建一个名为password的表头,设置值为varchar(32)
常用对象:
max_length=32 #指定结构为字符串,最多32字符
primary_key = True #用于指定主键字段
default='xxx' #用于设置默认值,与null和blank互斥
unique=True #唯一
null=True blank=True #数据库可以为null form表单允许为空,一般会一起出现,与default互斥
auto_now_add=True #新创建对象时自动添加当前日期时间。
auto_now=True #每次修改、新增时修改为当前日期时间。
sex_type =(('male','男'),('female','女'))
sex = models.CharField('性别',choices=sex_type,default='male') #将多个选项单独创建,再导入类中进行选项的选择。
原文链接:https://docs.djangoproject.com/zh-hans/4.2/ref/models/fields/
快速上手:https://docs.djangoproject.com/zh-hans/4.2/topics/db/models/#automatic-primary-key-fields
类(表结构)创建
-
models.CharField
- 新增字符串字段
from django.db import models
class user(models.Model):
username = models.CharField(max_length=32)
#创建数据名为username的,并且varchar(32)的表头。
-
models.AutoField
- 新增自增字段,并添加主键。
- 其中的permary_key为必填字段
pid = models.AutoField(primary_key = True)
-
models.IntegerField
- 一个整数类型。数值的范围是 -2147483648 ~ 2147483647。
num = models.IntegerField()
-
models.DateField
- 日期类型,日期格式为YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.date的实例。
- auto_now和auto_now_add和default参数是互斥的,不能同时设置。
对象:
- auto_now:每次修改、新增时修改为当前日期时间。
- auto_now_add:新创建对象时自动添加当前日期时间。
num = models.DateTimeField(auto_now_add=True)
#datetime.datetime(2023,4,26,16,54,20,89451,tzinfo=<UTC>)
num = models.DateTimeField(auto_now=True)
#datetime.datetime(2023,4,26,16,54,20,89451,tzinfo=<UTC>)
-
DecimalField
- 输入十进制
name = models.DecimalField(max_digits=5,decimal_places=2) #999.99
-
所有类型
AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 primary_key=True 注:当model中如果没有自增列,则自动会创建一个列名为id的列 from django.db import models class UserInfo(models.Model): # 自动创建一个列名为id的且为自增的整数列 username = models.CharField(max_length=32) class Group(models.Model): # 自定义自增列 nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) SmallIntegerField(IntegerField): - 小整数 -32768 ~ 32767 PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正小整数 0 ~ 32767 IntegerField(Field) - 整数列(有符号的) -2147483648 ~ 2147483647 PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正整数 0 ~ 2147483647 BigIntegerField(IntegerField): - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807 BooleanField(Field) - 布尔值类型 NullBooleanField(Field): - 可以为空的布尔值 CharField(Field) - 字符类型 - 必须提供max_length参数, max_length表示字符长度 TextField(Field) - 文本类型 - 最好加一个允许null EmailField(CharField): - 字符串类型,Django Admin以及ModelForm中提供验证机制 IPAddressField(Field) - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制 GenericIPAddressField(Field) - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6 - 参数: protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6" unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both" URLField(CharField) - 字符串类型,Django Admin以及ModelForm中提供验证 URL SlugField(CharField) - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号) CommaSeparatedIntegerField(CharField) - 字符串类型,格式必须为逗号分割的数字 UUIDField(Field) - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证 FilePathField(Field) - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能 - 参数: path, 文件夹路径 match=None, 正则匹配 recursive=False, 递归下面的文件夹 allow_files=True, 允许文件 allow_folders=False, 允许文件夹 FileField(Field) - 字符串,路径保存在数据库,文件上传到指定目录 - 参数: upload_to = "" 上传文件的保存路径 storage = None 存储组件,默认django.core.files.storage.FileSystemStorage ImageField(FileField) - 字符串,路径保存在数据库,文件上传到指定目录 - 参数: upload_to = "" 上传文件的保存路径 storage = None 存储组件,默认django.core.files.storage.FileSystemStorage width_field=None, 上传图片的高度保存的数据库字段名(字符串) height_field=None 上传图片的宽度保存的数据库字段名(字符串) DateTimeField(DateField) - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] DateField(DateTimeCheckMixin, Field) - 日期格式 YYYY-MM-DD TimeField(DateTimeCheckMixin, Field) - 时间格式 HH:MM[:ss[.uuuuuu]] DurationField(Field) - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型 FloatField(Field) - 浮点型 DecimalField(Field) - 10进制小数 - 参数: max_digits,小数总长度 decimal_places,小数位长度 BinaryField(Field) - 二进制类型
-
models.ForeignKey
- 进行对多连表的创建,并设置级联删除。即当关联数据删除时,该信息也将删除。
- 创建完成后,表头信息是name_id 而不是name
- 创建完成关联对象后,想要展示,那么使用i.name.关联对象的属性即可调出。
name = models.ForeignKey('User',on_delete=models.CASCADE) #级联,并设置删除方式为级联删除。
可以设置其他选项:
name = models.ForeignKey('User',on_delete=models.SET()) #当关联数据删除时,设置一个其他值
name = models.ForeignKey('User',on_delete=models.SET_NULL) #当关联数据删除时,设置为NULL
name = models.ForeignKey('User',default='xxx',on_delete=models.SET_DEFAULT) #当关联表删除时,设置为默认值。
name = models.ForeignKey('User',related_name='xxx',on_delete=models.SET_DEFAULT) #使用反向查询时使用。
-
ManyToManyField
- 创建多连表时,使用该属性可以直接将多个表进行关联
- 该命令会 生成第三张表
- 如果要查询所关联的对象所有信息,那么使用author.books.all()
联合唯一
from django.db import models
class user(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=32)
class Meta:
unique_together=('username','password') #联合唯一,表示username和password共同组成唯一。
自定义方法:
即将数据进行重新整理后进行提交,使前端直接显示即可。不用在前端进行数据的操作工作
from django.db import models
class user(models.Model):
username = models.CharField(max_length=32)
def show_names(self):
return ''.join([str(i) for i in self.username.all()])
# 循环self对象中的所有username,并将username值转换成str名称,然后进行列表的添加,并进行拼接工作(多对多方法使用)
删:
对类(表)进行删除
如果需要删除整个类(这个表),那么就直接将已经同步好的ORM进行注释即可。
改:
对类(表)进行更改:
-
修改对象名称(表头信息)
直接修改名称即可,然后再将数据同步到数据库中。
数据库同步:
- 需要两个步骤进行。
- 在需要运行时,APP对mysql的配置一定要已经写入到了django的配置表中,否则将会报错。
创建迁移文件
- 配置如果没有异常情况时,会在该路径中创建一个py文件,记录创建信息。
python .\manage.py makemigrations
上传数据库
- 运行时,会出现大量OK字段,这里关注APP名称字段是否OK即可。
python .\manage.py migrate
数据退回操作
- 在没有进行同步命令时,是可以进行回退的。
- 当输入第一条更改命令后,想要回退,那么把APP中的更改文件删除即可。
查看操作记录
要查看的话,就看APP的相关操作即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)