zoukankan      html  css  js  c++  java
  • python_django_models模块

    django中models模块为各类数据库提供了统一的api,可根据不同的业务需求配置数据库。

    models模块开发流程:

    1. 配置数据库  详情:https://www.cnblogs.com/Vera-y/p/11492314.html
    2. 定义模型类: 一个模型类在数据库中对应一张数据表
    3. 生成迁移文件
    4. 执行迁移文件生成数据表
    5. 使用模型类进行增删改查

    这里主要是介绍models模块,那就不得不提到ORM

    ORM : 对象-关系-映射

       

    django中的增删改查,在orm中转换为create/insert等语句再和各种数据库进行交互,之后,在数据库中得到的数据集等在通过orm转换为python中的数据表

    orm的任务:

    • 根据对象的类型生成表结构
    • 将对象、列表的操作转换为sql语句
    • 将sql语句查询到的结构转换为对象、列表

    优点:
      减轻开发人员的工作量,不需要面对因数据库的变更而修改代码

    一个模型类在数据库中对应一张表,在模型类中定义的属性,对应表中的一个字段

    from django.db import models
    class Students(models.Model):      # 模型类
        # 字段
        id = models.AutoField(primary_key=True)  # 创建一个自增的主键字段
        name = models.CharField(null=False,max_length=20)  # 创建一个varchar(20)类型的name且不能为空

    django 会为表增加自动给增长的主键列,每个模型只能有一个主键列,若使用选项设置某属性为主键列后,则django不会再生存默认的主键列。

    属性命名限制:1.遵循标识符规则 2.不允许连续的下划线

    字段类型:字段的创建

    AutoField

    主键类型,一个根据实际id自动增长的integerField,通常不指定,若不指定,一个主键字段将自动添加到模型中

    CharField(max_length = 字符长度) 字符串类型
    TextField 大文本字段,一般超过4000使用,(显示的是一个文本域)
    IntegerField 整数类型
    DecimalField(max_digits=None,decimal_places=None) 十进制浮点数类型

    max_digits:位数总数
    decimal_places:小数点后的数字位数

    FloatField 浮点数类型
    BooleanField true/false 字段,默认的表单控制室checkboxInput
    NullBooleanField null/true/false
    DateField([auto_now=False,auto_now_add=False]) 日期类型

    auto_now:每次保存对象时,自动设置为当前时间(最后一次修改)
    auto_now_add:每次对象被创建时,被自动设置为当前时间(第一次创建)
    auto_now,anto_now_add,default 不能同时被设置

    TimeField 时间类型,参数和DateField相同
    DateTimeField 日期-时间类型,参数和DateField相同
    FileField 上传文件的字段
    ImageField 继承了FileField所有属性和方法,确保是一个有效的image文件

    举个栗子:

    from django.db import models
    
    class Students(models.Model):
        # 字段
        id = models.AutoField(primary_key=True)  # 创建一个自增的主键字段
        name = models.CharField(null=False,max_length=20)  # 创建一个varchar(20)类型的name且不能为空
        age = models.IntegerField()
        gender = models.BooleanField()

    字段选项:对字段进行的约束

    null 设置为true,存入空值到数据库,默认为false,数据库范畴
    blank 设为true ,该字段允许为空白,默认为false,表单验证范畴
    db_column 设置字段的名称,若字段名未指定,则使用设置的属性名称
    db_index 设为true,表会为此字段创建索引
    default 设置为默认值
    primary_key 设置为true ,则该字段会成为模型的主键
    unique 设置为true ,这个字段在表中必须有唯一值

    数据表间的关系

    ForeignKey 一对多(常用)将字段定义在多的端中
    ManyToManyField

    多对多,将字段定义在两端中

    OneToOneField 一对一,将字段定义在任意一端中

    举个栗子:

    sgrade = models.ForeignKey("Grades")

    元选项:在模型类中定义Meta类,用于设置元信息(对数据库中具体数据的操作(表级操作)例:排序)

    例:db_table:定义数据表名,若不定义,则数据表名默认为:项目名小写_类名小写

            ordering:默认排序字段,获取列表时使用  ordering['id']:升序 ordering['-id']:降序

    举个栗子:

    from django.db import models
    class Students(models.Model):
        # 字段
        id = models.AutoField(primary_key=True) 
        name = models.CharField(null=False,max_length=20) 
        age = models.IntegerField(null=False)
        gender = models.BooleanField()
    
        class Meta:
            db_table = "students"    # 修改成功!
            ordering = ['id']

    栗子果:

    mysql> use python_mysql
    Database changed
    mysql> show tables;
    +----------------------------+
    | Tables_in_python_mysql     |
    +----------------------------+
    | auth_group                 |
    | auth_group_permissions     |
    | auth_permission            |
    | auth_user                  |
    | auth_user_groups           |
    | auth_user_user_permissions |
    | django_admin_log           |
    | django_content_type        |
    | django_migrations          |
    | django_session             |
    | students                   |
    +----------------------------+

    模型成员

    模型的类属性:

        当模型类没有指定管理器,django则为模型创建一个名为objects的管理器,用于和数据库进行交互(即django模型与数据库交互的接口)

    自定义模型管理器:

      stuObj = models.Manager()  # 自定义的模型管理器(貌似没什么luan用)

    更深入的就是自定义模型管理器(Manager()类):

    from django.db import models
    
    class studentsManager(models.Manager):
        def get_queryset(self):
            return super(studentsManager, self).get_queryset().filter(gender=False)
            # filter() 过滤函数可多次叠加
    
    class Students(models.Model):
        stuObj = models.Manager()  # 自定义的模型管理器
        stuObj1 = studentsManager()
        id = models.AutoField(primary_key=True)  
        name = models.CharField(null=False,max_length=20)  
        age = models.IntegerField(null=False)
        gender = models.BooleanField(default=True)
    
        class Meta:
            db_table = "students"
            ordering = ['id']

    可在terminal中验证:

    >>python manage.py shell     # 进入python环境

    >>>from my_inn.models import Students;

    >>>Students.stuObj1.all();

    >>>Students.stuObj.all();        # 可作结果对比

    模型的创建对象

             目的:向数据库中添加数据,当创建对象时,django不会对数据进行读写操作,只有调用save()方法后才与数据库进行交互

    两种方法:

    • 在模型类中增加一个类方法(方法上加上@staticmethod)(即在models 创建表的类下添加方法)
    • 在定义管理器中添加一个方法(即在models 中studentsManager管理器中添加方法)

    注:__init__方法在父类models.Model中被使用,所以我们创建的对象是空对象。

    举个栗子:

    from django.db import models
    
    class studentsManager(models.Manager):
        def get_queryset(self):
            return super(studentsManager, self).get_queryset().filter(gender=False)
            # filter() 过滤函数可多次叠加
        # 管理器中创建对象
        def createStudent1(self, sname, sage, sgender):
            # stu1 = Students()   # 只能创建students类的属性,若有外键就不通用勒
            stu1 = self.model()     #  类型:'my_inn.models.Students'
            stu1.name = sname
            stu1.age = sage
            stu1.gender = sgender
            return stu1
    
    class Students(models.Model):
        stuObj = models.Manager()  # 自定义的模型管理器
        stuObj1 = studentsManager()
        # 字段
        id = models.AutoField(primary_key=True)  
        name = models.CharField(null=False,max_length=20)  
        age = models.IntegerField(null=False)
        gender = models.BooleanField(default=True)
    
        class Meta:
            db_table = "students"
            ordering = ['id']
    
        # 定义一个类方法创建对象
        @classmethod
        def createStudent(cls, sname, sage, sgender):
            stu = cls(name=sname, age=sage,gender=sgender)
            return stu
    models.py

    对应的在views.py中的函数操作:

    from django.shortcuts import render,redirect,HttpResponse
    from my_inn import models
    
    def addstudent(request):       # 类方法创建对象
        stu = Students.createStudent('nini',22,0)
        stu.save()         # 更新数据库
        return HttpResponse('...')
    
    def addstudent1(request):     # 管理器创建对象
        stu = Students.stuObj1.createStudent('nili',23,1)
        stu.save()          # 更新数据库
        return HttpResponse('...')
    Views.py
  • 相关阅读:
    Repeater嵌套Repeater的结构
    解决还原数据库 出现单用户
    常见的一些C#开源框架或者开源项目
    vue 实现动态路由
    c#使用Split分割换行符
    SQL Server 时间戳与时间格式互相转换
    值与枚举的转化
    编程之美,让美国人科技高速发展,浅谈C语言带给美国的变化
    SQL CE数据库搭建和操作
    C# 与API
  • 原文地址:https://www.cnblogs.com/Vera-y/p/11914233.html
Copyright © 2011-2022 走看看