本文是根据 datawhale 开源 Django后端开发入门 做的笔记
Task04:序列化及其高级使用、ModelViewSet
代码编写
1、定义序列化器
serializer.py
from rest_framework import serializers
from .models import GoodsCategory, Goods
# 产品分类序列化器
class GoodsCategorySerializer(serializers.ModelSerializer):
class Meta:
# 指定需要序列化的表
model = GoodsCategory
# 指定需要序列化的字段,all表示所有模型字段都将被序列化
# fields = '__all__'
fields = ('name', 'remark')
# 产品序列化器
class GoodsSerializer(serializers.ModelSerializer):
# 外键字段相关的数据,需要单独序列化
category = GoodsCategorySerializer()
class Meta:
# 指定需要序列化的表
model = Goods
# 指定需要序列化的字段,all表示所有模型字段都将被序列化
# 序列化单个字段
fields = ('name',)
# 序列化多个字段
fields = ('name', 'number',)
# 序列化所有字段
fields = '__all__'
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
from .serializer import GoodsSerializer
from rest_framework.views import APIView
from .serializer import GoodsCategorySerializer
class GetGoods(APIView):
def get(self, request):
data = Goods.objects.all()
serializer = GoodsSerializer(instance=data, many=True)
print(serializer.data)
return Response(serializer.data)
def post(self, request):
# 从请求数据中提取字段
request_data = {
"category": request.data.get("Goodscategory"),
"number": request.data.get("number"),
"name": request.data.get("name"),
"barcode": request.data.get("barcode"),
"spec": request.data.get("spec"),
"shelf_life_days": request.data.get("shelf_life_days"),
"purchase_price": request.data.get("purchase_price"),
"retail_price": request.data.get("retail_price"),
"remark": request.data.get("remark"),
}
# 使用create()方法创建新的商品对象
new_goods = Goods.objects.create(**request_data)
# 对创建的对象进行序列化,并作为响应返回
serializer = GoodsSerializer(instance=new_goods)
return Response(serializer.data)
urls.py
from django.contrib import admin
from django.urls import path
from erp.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('filtergoodscategory/', FilterGoodsCategory),
path('insertgoodscategory/', InsertGoodsCategory),
path('filtergoodscategoryapi/', FilterGoodsCategoryAPI.as_view()),
path('getgoods/', GetGoods.as_view()),
]
2、ModelViewSet
ModelViewSet 是 Django REST framework 提供的一个视图集类,它封装了常见的模型操作方法,提供了默认的增删改查功能。
修改代码如下:
views.py
from rest_framework.viewsets import ModelViewSet
from rest_framework.decorators import action
class GoodsCategoryViewSet(ModelViewSet):
# 指定查询集(用到的数据)
queryset = GoodsCategory.objects.all()
# 指定查询集用到的序列化容器
serializer_class = GoodsCategorySerializer
@action(detail=False, methods=['get'])
def latest(self, request):
latest_obj = GoodsCategory.objects.latest('id')
print(latest_obj)
# 对创建的对象进行序列化,并作为响应返回
serializer = GoodsCategorySerializer(instance=latest_obj)
return Response("hello 你调用了自定义函数latest")
注意action中定义的请求类型(get/post),在接口测试时要选择同样的请求类型。
serializer.py
# 产品序列化器
class GoodsSerializer(serializers.ModelSerializer):
# 外键字段相关的数据,需要单独序列化
category = GoodsCategorySerializer()
class Meta:
# 指定需要序列化的表
model = Goods
# 指定需要序列化的字段,all表示所有模型字段都将被序列化
# 序列化单个字段
fields = ('name',)
# 序列化多个字段
fields = ('name', 'number',)
# 序列化所有字段
fields = '__all__'
测试用例
1、先向后台数据库插入一些Goods数据。

2、切换到对应的虚拟环境,启动服务器 。启动shell。
3、测试序列化单个对象。

4、测试序列化多个对象

5、测试GetGoods接口,采用get请求,获取Goods表中的所有数据。

6、测试GetGoods接口,采用post请求,向Goods表中插入一条“梨”的商品数据,在body中构造好字段。

7、测试GetGoods接口,采用post请求,将刚才插入的“梨”的商品数据的name字段修改为苹果,重新提交。再用GET请求获取更新后的商品数据。发现id=4的商品名称已经从梨修改为了苹果。
ModelViewSet将和Task05的路由组件、自定义函数一起测试。
遇到问题及解决方法
1、输入python manage.py shell命令,启动shell环境时报错:
File "manage.py", line 17 ) from exc
原因:没有先启动对应的虚拟环境,python版本不对。
解决办法:在启动服务器和shell之前先启动正确配置的虚拟环境。
2、输入getgoods接口http://127.0.0.1:8000/getgoods,服务器返回错误信息:"GET /GoodsCategoryViewSet/latest HTTP/1.1" 301 0
原因:输入的路径忘记加/,正确路径应该为:http://127.0.0.1:8000/getgoods/
本文介绍了如何在Django后端使用DRF(DjangoRESTframework)进行序列化,并展示了如何在ModelViewSet中实现商品分类和商品的基本CRUD操作,包括单个对象和多个字段的序列化,以及自定义action函数的应用。
471

被折叠的 条评论
为什么被折叠?



