ORM——类&对象操作

创建一个表(ORM中就是创建一个类)

  1. 前提是需要进行mysql数据库的配置:请见:数据库配置
  2. 通常设置在models.py中
  3. 下面将举例创建一个表,表头有username和passowrd两个值。
  4. 使用models模块来进行对数据库的操作用来和mysql进行交互的模块。
  5. 在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

  1. 新增字符串字段
from django.db import models
class user(models.Model):
    username = models.CharField(max_length=32)   
    #创建数据名为username的,并且varchar(32)的表头。
  • models.AutoField

  1. 新增自增字段,并添加主键。
  2. 其中的permary_key为必填字段
pid = models.AutoField(primary_key = True)
  • models.IntegerField

  1. 一个整数类型。数值的范围是 -2147483648 ~ 2147483647。
num = models.IntegerField()
  • models.DateField

  1. 日期类型,日期格式为YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.date的实例。
  2. 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

  1. 输入十进制
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):
            - 小整数 -3276832767
    
        PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
            - 正小整数 032767
    
        IntegerField(Field)
            - 整数列(有符号的) -21474836482147483647
    
        PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
            - 正整数 02147483647
    
        BigIntegerField(IntegerField):
            - 长整型(有符号的) -92233720368547758089223372036854775807
    
        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

  1. 进行对多连表的创建,并设置级联删除。即当关联数据删除时,该信息也将删除。
  2. 创建完成后,表头信息是name_id  而不是name
  3. 创建完成关联对象后,想要展示,那么使用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

  1. 创建多连表时,使用该属性可以直接将多个表进行关联
  2. 该命令会 生成第三张表
  3. 如果要查询所关联的对象所有信息,那么使用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进行注释即可。

改:

对类(表)进行更改:

  • 修改对象名称(表头信息)

直接修改名称即可,然后再将数据同步到数据库中。

数据库同步:

  1. 需要两个步骤进行。
  2. 在需要运行时,APP对mysql的配置一定要已经写入到了django的配置表中,否则将会报错。

创建迁移文件

  1. 配置如果没有异常情况时,会在该路径中创建一个py文件,记录创建信息。
python .\manage.py makemigrations

上传数据库

  1. 运行时,会出现大量OK字段,这里关注APP名称字段是否OK即可。
python .\manage.py migrate

数据退回操作

  • 在没有进行同步命令时,是可以进行回退的。
  • 当输入第一条更改命令后,想要回退,那么把APP中的更改文件删除即可。

查看操作记录

要查看的话,就看APP的相关操作即可。

 

posted @   新兵蛋Z  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示