Django—ORM(三)

一、框架

1、定义

  • 把类和数据进行映射
  • 通过类和对象就能操作它所对应表格中的数据(CRUD)

2、步骤

  • 配置数据库连接信息
    • 创建数据库和用户
      • CREATE DATABASE my_django charset=utf8
      • GRANT ALL PRIVILEGES ON *.* TO ROOT '@'%' IDENTIFIED BY 123456
      • flush privileges
    • 配置数据库 :全局setting.py中进行配置
DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    # }
    'default': {
        #指定引擎
        'ENGINE': 'django.db.backends.mysql',
        #指定数据库名称
        'NAME': 'my_django',
        #数据库用户名
        'USER': 'ROOT',
        'PASSWORD': 'fmwan2019',
        'HOST': 'localhost',
        'PORT': 3306
    }
}

 

    • 安装mysqlclient
  • 在models.py定义模型类

  

from django.db import models

# Create your models here.
class Person(models.Model):
  """创建Person类"""
  first_name = models.CharField(max_length=30)
  last_name = models.CharField(max_length=30)
  • 迁移
  1. 第一步:生成迁移初始化脚本    makemigrations [appname]

 

 

   2.第二步:执行初始化脚本  migrate [appname]

  

 

 

 在指定的数据库my_django中生成两张表:projects_migrations, projects_person;其中projects_migrations记录迁移历史记录

 

 

 projects_person的字段就是models.py中定义的变量

 

 

 

总结:
  • 每一个应用下的数据库模型类,需要再当前应用下的models.py文件中定义
  • 一个数据库模型类相当于一个数据库表(table)
  • 一个数据库模型类需要继承Model或Model的子类
  • 定义一个类属性,就相当于数据库表中的一个字段
  • django默认会创建一个自动递增的id主键

  等价于  id = models.AutoField(primary_key=True)

  • 通过类和对象操作完成数据增删改查操作
  • 默认创建的数据表为:应用名小写_数据库模型类小写

ORM的作用

 

 

 

 

4、数据库模型解析:

models.py再新建类Projects:

class Projects(models.Model):
  '''Projects 模型类'''
  # CharField:字符串类型
  # max_length:字段最大长度
  # verbose_name: 用于更人性化的字段名
  # unique: 默认设置当前字段是否唯一,默认为False
  # help_text:用于api文档中的中文名称
  
  name = models.CharField(verbose_name='项目名称', max_length=200, unique=True, help_text='项目名称')
  leader = models.CharField(verbose_name='负责人', max_length=50, help_text='负责人')
  tester = models.CharField(verbose_name='测试人员', max_length=50, help_text='测试人员')
  programer = models.CharField(verbose_name='开发人员', max_length=50,  help_text='开发人员')
  pubish_app = models.CharField(verbose_name='应用名称', max_length=100, help_text='应用名称')
  # null: 设置数据库中此字段允许为空
  # blank: 用于设置前端可以不传递
  # default:设置默认值
  desc = models.TextField(verbose_name='简要描述',  help_text='简要描述', blank=True, default='', null=True)
  # models.IntegerField(choices=['male','female'])

进行迁移,数据库表结果如下:

 

 

 

  •  Meta子类

用于设置当前数据模型的元数据信息

class Projects(models.Model):
  '''Projects 模型类'''
  # CharField:字符串类型
  # max_length:字段最大长度
  # verbose_name: 用于更人性化的字段名
  # unique: 默认设置当前字段是否唯一,默认为False
  # help_text:用于api文档中的中文名称
  
  name = models.CharField(verbose_name='项目名称', max_length=200, unique=True, help_text='项目名称')
  leader = models.CharField(verbose_name='负责人', max_length=50, help_text='负责人')
  tester = models.CharField(verbose_name='测试人员', max_length=50, help_text='测试人员')
  programer = models.CharField(verbose_name='开发人员', max_length=50,  help_text='开发人员')
  pubish_app = models.CharField(verbose_name='应用名称', max_length=100, help_text='应用名称')
  # null: 设置数据库中此字段允许为空
  # blank: 用于设置前端可以不传递
  # default:设置默认值
  desc = models.TextField(verbose_name='简要描述',  help_text='简要描述', blank=True, default='', null=True)
  # models.IntegerField(choices=['male','female'])
  
  #定义子类Meta
  class Meta:
    db_table = 'tb_projects'

进行迁移后,查看数据库,数据表名称一杯更改:

 

  •  连接两张表

新建interface应用,models.py设置与projects的外联关系

from django.db import models


#一个项目中有多个接口,需要在"多"的一侧创建外键
#项目表为父表("-"),接口表("多")为子表
# Create your models here.
class Interfaces(models.Model):
  name = models.CharField(verbose_name='接口名称', max_length=200, unique=True, help_text='接口名称')
  tester = models.CharField(verbose_name='测试人员', max_length=50, help_text='测试人员')
  desc = models.TextField(verbose_name='简要描述', help_text='简要描述', blank=True, default='', null=True)
  #第一个参数为关联的模型路径(应用名.模型类)或者模型类
  #第二个参数设置的是当父表删除之后,该字段的处理方式
  #CASCADE  -->子表也会被删除
  #SET_NULL  -->当前外键值也会被设置为NOne
  #PROJECT  -->会报错
  #SET_DEFAULT  -->设置默认值,同事需要制定默认值,null=True
  project = models.ForeignKey('projects.Projects', on_delete=models.CASCADE, verbose_name='所属项目',
                              help_text='所属项目')
  class Meta:
    db_table = 'tb_interfaces'
    verbose_name = '接口'
    verbose_name_plural = '接口'
models.ForeignKey()参数说明:
  #第一个参数为关联的模型路径(应用名.模型类)或者模型类
  #第二个参数设置的是当父表删除之后,该字段的处理方式
  #CASCADE  -->子表也会被删除
  #SET_NULL  -->当前外键值也会被设置为NOne
  #PROJECT  -->会报错
  #SET_DEFAULT  -->设置默认值,同事需要制定默认值,null=True
迁移后,数据库表结构如图:

 

 5、admin站点

 

 创建超级管理员:createsuperuser

输入用户名,邮箱,密码

 

 

 创建用户成功后,在auth_user表中插入了创建的超级管理员用户数据:

 

使用创建的超级管理员用户登录admin站点:

 在应用的admin.py文件下,将应用添加到admin站点,这样就可以通过admin来访问:

from django.contrib import admin
from interfaces.models import Interfaces

# Register your models here.
admin.site.register(Interfaces)

 

from django.contrib import admin
from projects.models import Projects, Person

# Register your models here.
admin.site.register(Projects)
admin.site.register(Person)

刷新页面:

 

 在后端增加项目数据:

 

 

 数据库表tb_projects插入了一条数据:

 

 models.py增加__str__()方法

  def __str__(self):
    return self.name

项目列表显示项目名称:

 

 在项目列表中只显示了项目名称,如果要显示其他信息,则需要在应用的admin.py中定义一个站点管理类:

from django.contrib import admin
from projects.models import Projects, Person

# Register your models here.


class Project_Admin(admin.ModelAdmin):
  """定制后台站点管理类"""
  #指定在修改(新增)中需要显示的字段
  fields = ('name', 'leader', 'tester', 'programer', 'pubish_app')
  
  #指定需要列出的字段
  list_display = ['id', 'name', 'leader', 'tester']
admin.site.register(Projects, Project_Admin)
# admin.site.register(Person)

刷新页面:

 

 

 

 

 
posted @ 2019-10-12 14:36  sinder2018  阅读(17)  评论(0)    收藏  举报