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

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

1.1 数据表创建

1.1.1 模块功能

如前所述,models.py文件主要用一个 Python 类来描述数据表。运用这个类,可以通过简单的 Python 代码来创建、检索、更新、删除

数据库中的记录而无需写一条又一条的SQL语句。今天的例子就是在model.py中创建两个表:产品分类表和产品信息表。

1.1.1.1 models.py

产品分类表

py 复制代码
class GoodsCategory(Model):

name = CharField(max_length=64, verbose_name='名称')

remark = CharField(max_length=256, null=True, blank=True, verbose_name='备注')

产品信息表

py 复制代码
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 合并数据库

这两个命令是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 字段定义

python 复制代码
`class DeliveryMaterial(Model):`
      
`class Status(TextChoices):`
        
`QUALIFIED = ('qualified', '良品')`
`UNQUALIFIED = ('unqualified', '不良品')`

`status = CharField(max_length=32, choices=Status.choices, default=Status.QUALIFIED, verbose_name='状态')`

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文件中注册你的模型:

python 复制代码
from django.contrib import admin
from .models import * # 引入产品表

# 一定要分开逐个注册,不能放在一起

admin.site.register(Goods)

 # 在admin站点中 注册产品表

admin.site.register(GoodsCategory) 

# 在admin站点中 注册产品表

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

python 复制代码
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)

urls.py

  • 放入路由
python 复制代码
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),
  ]
  • 使用postman针对insertGoodsCategory/filtergoodscategory/API接口进行测试,测试结果如下


相关推荐
数据智能老司机7 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
数据智能老司机8 小时前
CockroachDB权威指南——开始使用
数据库·分布式·架构
松果猿8 小时前
空间数据库学习(二)—— PostgreSQL数据库的备份转储和导入恢复
数据库
无名之逆8 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
s9123601018 小时前
rust 同时处理多个异步任务
java·数据库·rust
数据智能老司机8 小时前
CockroachDB权威指南——CockroachDB 架构
数据库·分布式·架构
hzulwy9 小时前
Redis常用的数据结构及其使用场景
数据库·redis
程序猿熊跃晖9 小时前
解决 MyBatis-Plus 中 `update.setProcInsId(null)` 不生效的问题
数据库·tomcat·mybatis
强化生物科研小助手9 小时前
CAS:47623-98-3,DiSBAC2(3)一种慢反应的膜电位敏感探针
django·html·pygame
Three~stone10 小时前
MySQL学习集--DDL
数据库·sql·学习