• 【Django 02】数据表构建、数据迁移与管理


    1. Django 构建数据表创建与数据迁移

    1.1 数据表创建

    1.1.1 模块功能

    如前所述,models.py文件主要用一个 Python 类来描述数据表。运用这个类,可以通过简单的 Python 代码来创建、检索、更新、删除
    数据库中的记录而无需写一条又一条的SQL语句。今天的例子就是在model.py中创建两个表:产品分类表和产品信息表。

    1.1.1.1 models.py

    产品分类表

    class GoodsCategory(Model):
    
    name = CharField(max_length=64, verbose_name='名称')
    
    remark = CharField(max_length=256, null=True, blank=True, verbose_name='备注')
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    产品信息表

    class Goods(Model):
            
    number = CharField(max_length=32, verbose_name='编号')
    
    name = CharField(max_length=64, verbose_name='名称')
    
    barcode = CharField(max_length=32, null=True, blank=True, verbose_name='条码')
    
    category = ForeignKey('goods.GoodsCategory', on_delete=SET_NULL, null=True,related_name='goods_set', verbose_name='产品分类')
    
    spec = CharField(max_length=64, null=True, blank=True, verbose_name='规格')
            
    shelf_life_days = IntegerField(null=True, verbose_name='保质期天数')
    
    purchase_price = FloatField(default=0, verbose_name='采购价')
    
    retail_price = FloatField(default=0, verbose_name='零售价')
    
    remark = CharField(max_length=256, null=True, blank=True, verbose_name='备注')
       
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    1.2 合并数据库

    这两个命令是Django框架中的关键命令,用于进行数据库迁移。当你修改了Django模型后,你需要运行这两个命令,以将这些更改应用到数据库中。

    python manage.py makemigrations

    这个命令用于生成迁移脚本。当你更新了模型文件之后,需要运行该命令,Django会检测模型的改变,然后自动生成相应的迁移脚本,存储在migrations/目录下。通常来说,你需要针对每个应用运行一次该命令。

    python manage.py migrate

    这个命令用于将迁移脚本应用到数据库中。当你在模型文件中进行更改之后,需要先通过makemigrations命令生成迁移脚本,然后运行该命令将这些脚本应用到数据库中。对于新的迁移脚本,Django会逐个执行它们,从而更新数据库结构。对于已经执行过的脚本,Django会跳过它们,避免重复执行。

    这两个命令是Django框架中非常重要的命令,在修改数据库相关内容时必须时刻清醒地记住使用它们。

    在这里插入图片描述

    2. Django-models的常用字段和常用配置

    2.1 常用字段

    CharField 用于存储字符串类型,有最大长度限制

    IntegerField 用于存储整数类型

    FloatField用于存储浮点数类型

    BooleanField 用于存储布尔类型

    DateField 用于存储日期类型

    DateTimeField 用于存储日期和时间类型

    ImageField 用于存储图片类型

    FileField 用于存储文件类型

    ForeignKey 外键 用于表示数据库表之间的关联关系

    OneToOneField 一对一 用于表示一对一的关联关系

    ManyToManyField 多对多 用于表示多对多的关联关系
      ‍

    2.2 常用配置

    max_length 字段的最大长度限制,可以应用于多种不同的字段类型。

    verbose_name 字段的友好名称,便于在管理员后台可视化操作时使用。

    default 指定字段的默认值。

    null 指定字段是否可以为空。

    null=True 设置允许该字段为 NULL 值

    blank 指定在表单中输入时是否可以为空白。

    choices 用于指定字段的可选值枚举列表,在最上面定义

    2.3 字段定义

    `class DeliveryMaterial(Model):`
          
    `class Status(TextChoices):`
            
    `QUALIFIED = ('qualified', '良品')`
    `UNQUALIFIED = ('unqualified', '不良品')`
    
    `status = CharField(max_length=32, choices=Status.choices, default=Status.QUALIFIED, verbose_name='状态')`
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    TextChoices 是 Django 3.0 引入的一个枚举类,用于在模型字段中创建可选择的、文本值的选项。
    related_name 指定在多对多等关系中反向使用的名称。

    on_delete 指定如果外键关联的对象被删除时应该采取什么操作。

    3. Django-admin 引入admin后台和管理员

    3.1 创建管理员

    3.1.1 创建后台 admin 管理员

    在终端运行命令

    python manage.py createsuperuser

    登录 admin 后台

    http://127.0.0.1:8000/admin

    python manage.py runserver

    在这里插入图片描述

    3.2 配置

    admin.py文件中注册你的模型:

    from django.contrib import admin
    from .models import * # 引入产品表
    
    # 一定要分开逐个注册,不能放在一起
    
    admin.site.register(Goods)
    
     # 在admin站点中 注册产品表
    
    admin.site.register(GoodsCategory) 
    
    # 在admin站点中 注册产品表
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    3. 构建数据表(外键的使用)

    3.1 外键

    models.py

    category = ForeignKey(GoodsCategory,on_delete=SET_NULL,related_name='goods_set',null=True,verbose_name='产品分类')

    on_delete 设置当外键对应的数据被删除时的反应
    null=True

    外键的概念

    外键是一种用于建立表之间关联关系的约束,通常指的是一个模型中的一个或多个字段的值必须符合另一个模型中对应字段的值。

    增加数据

    • 苹果 - 水果
    • 桃子 - 水果
    • 猴子 - 动物
    • 大象 - 动物
    • 构建根据分类获取某个分类下的产品 API

    views.py

    from django.shortcuts import render
    from rest_framework.response import Response
    from .models import *
    from rest_framework.decorators import api_view
    from django.shortcuts import get_object_or_404
    # Create your views here.
    # GET
    # POST
    
    # 函数式编程
    @api_view(['POST', 'GET'])
    def InsertGoodsCategory(request):
        category_name = request.data.get('分类名字')
        
        # 获取分类对象或创建新的分类对象
        category, created = GoodsCategory.objects.get_or_create(name=category_name)
        
        # 判断是否已存在分类
        if not created:
            return Response({"status": "已存在", "goods_category": category_name}, status=200)
        else:
            return Response({"message": f"Successfully inserted category '{category_name}'."})
    
    @api_view(['POST','GET'])
    def FilterGoodsCategory(request):
        data = request.data.get('分类名字')
        goods = GoodsCategory.objects.filter(name=data)
        if goods.exists():
            return Response({"status": "已存在", "goods_category": data}, status=200)
        else:
            return Response({"status": "不存在" ,"goods_category": data}, status=404)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    urls.py

    • 放入路由
    from django.contrib import admin
    from django.urls import path
    from apps.erp_test.views import *
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('filtergoodscategory/', FilterGoodsCategory),
        path('insertgoodscategory/', InsertGoodsCategory),
      ]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 使用postman针对insertGoodsCategory/filtergoodscategory/API接口进行测试,测试结果如下
      在这里插入图片描述

    在这里插入图片描述


    在这里插入图片描述

  • 相关阅读:
    SpringBoot 之 Jasypt 实现yml配置文件加密
    【音视频】ffplay源码解析-FrameQueue队列
    Vue3理解(7)
    AI 绘画 | Stable Diffusion 涂鸦功能与局部重绘
    ES6闭包
    【广州华锐互动】智能楼宇3D数字化展示,实现对建筑物的实时监控和管理
    浏览器安装vue调试工具
    达梦数据库MAIN表空间导致磁盘满问题的处理和总结
    spring boot 使用单元测试JUnit5
    30组易混易错词汇辨析,柯桥成人英语培训哪家好
  • 原文地址:https://blog.csdn.net/weixin_42322991/article/details/133913701