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='备注')
产品信息表
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 字段定义
`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文件中注册你的模型:
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
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
- 放入路由
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接口进行测试,测试结果如下