✍52 django向多张表添加数据
每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力,却得不到结果的日子,我们把它叫做扎根。
原文链接 : https://blog.csdn.net/Return_Li/article/details/106242343
同事遇到的多表数据写入和更新问题, 找到上面这篇文章, 记录下重点
示例 :
- models.py
from django.db import models
# 品牌
class Brand(models.Model):
name = models.CharField(max_length=20, verbose_name='名称')
'''...其他字段省略....'''
class Meta:
db_table = 'tb_brand'
def __str__(self):
return self.name
# 分类
class Cate(models.Model):
brand = models.ForeignKey(Brand, on_delete=models.CASCADE, related_name='brand_cate', null=True, blank=True, verbose_name='外键关联')
cate_name = models.CharField(max_length=100, verbose_name='分类名称')
'''...其他字段省略....'''
class Meta:
db_table = 'tb_cate'
# 商品
class Goods(models.Model):
cate = models.ForeignKey ( Cate, on_delete=models.CASCADE, related_name='cate_goods', null=True, blank=True,
verbose_name='外键关联' )
goods_name = models.CharField(max_length=50, verbose_name='商品名称')
goods_size = models.CharField(max_length=50, verbose_name='商品规格')
goods_count = models.CharField(max_length=100, verbose_name='商品数量')
'''...其他字段省略....'''
class Meta:
db_table = 'tb_goods'
def __str__(self):
return self.goods_name
- views.py
from .serializers import *
from rest_framework.views import APIView
from rest_framework.response import Response
class GoodsListView(APIView):
def post( self, request):
'''添加数据集'''
data = request.data
print(data)
brand = BrandSerializer(data=data)
if brand.is_valid():
brand.save()
return Response ( {'code': 200,"message":'SUCCESS'} )
else:
print(brand.errors)
return Response ( {'code': 400, "message":'ERROR'} )
def put( self, request):
'''修改数据集'''
data = request.data
brand_instance = Brand.objects.get(id=data['id'])
brand = BrandSerializer(brand_instance,data)
if brand.is_valid():
brand.save()
return Response ( {'code': 200,"message":'SUCCESS'} )
else:
print(brand.errors)
return Response ( {'code': 400, "message":'ERROR'} )
- serializer
from goods.models import *
from rest_framework import serializers
class GoodsSerializer(serializers.ModelSerializer):
class Meta:
model = Goods
fields = ('id', 'goods_name', 'goods_count', 'goods_size')
class CateSerializer(serializers.ModelSerializer):
cate_goods = GoodsSerializer ( many=True )
class Meta:
model = Cate
fields = ('id', 'cate_name', 'cate_goods')
class BrandSerializer(serializers.ModelSerializer):
brand_cate = CateSerializer ( many=True )
class Meta:
model = Brand
fields = ('id', 'name', 'brand_cate')
def create(self, validated_data):
# pop 弹出 data 中的数据并保存
brand_cates = validated_data.pop('brand_cate')
# 并进行第一张表的添加
brand = Brand.objects.create(**validated_data)
# 遍历 弹出的第二张表的数据并添加第二章表, 且主键信息为单独添加
for cate_data in brand_cates:
cate_goods = cate_data.pop ( 'cate_goods' )
cate = Cate.objects.create(brand=brand, **cate_data)
# 第三张表数据添加
for goods in cate_goods:
Goods.objects.create (cate=cate, **goods)
return brand
def update(self, instance, validated_data):
# 获取当前json 数据中 外键表的数据
brand_cate = validated_data.pop('brand_cate')
# 通过 instance 实例 去获取它外键表的实例
brand_cate_data = (instance.brand_cate).all()
brand_cate_data = list(brand_cate_data)
# 修改 当前实例表的数据
instance.name = validated_data.get('name', instance.name)
instance.save()
# 遍历 pop弹出的 外键表要修改的数据
for cate_data in brand_cate:
# 继续弹出第三张表外键的数据
goods_data = cate_data.pop ( 'cate_goods' )
# 获取第一张外键的 实例
cate_instance = brand_cate_data.pop(0)
# 获取第三张表的实例
cate_goods = list((cate_instance.cate_goods).all())
# 更新 第一张外键表数据
cate_instance.name = cate_data.get('cate_name', cate_instance.cate_name)
cate_instance.save()
# 遍历继续更新第三张表的数据
for goods in goods_data:
goods_instance = cate_goods.pop(0)
goods_instance.goods_name = goods.get("goods_name",goods_instance.goods_name)
goods_instance.goods_count = goods.get("goods_count",goods_instance.goods_count)
goods_instance.goods_size = goods.get("goods_size",goods_instance.goods_size)
goods_instance.save()
return instance