Django后端开发入门-Task04

本文介绍了如何在Django后端使用DRF(DjangoRESTframework)进行序列化,并展示了如何在ModelViewSet中实现商品分类和商品的基本CRUD操作,包括单个对象和多个字段的序列化,以及自定义action函数的应用。

本文是根据 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/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值