django-rest-framework中带外键字段的序列化器和视图类写法

1. 序列化器:

from rest_framework import serializers
from .models import BookInfo, HeroInfo


class BookInfoSerializer(serializers.ModelSerializer):
    """图书序列化器"""

    class Meta:
        model = BookInfo
        fields = "__all__"  # 映射模型类中存在的所有字段


class HeroInfoSerializer(serializers.ModelSerializer):
    """英雄序列化器"""
    # 支持序列化和反序列化, queryset参数这里需要注意:字段代表谁就指定谁的查询集hbook代表BookInfo,所以就指定BookInfo的查询集
    # hbook = BookInfoSerializer(queryset = BookInfo.objects.all())

    # 只支持序列化,不支持反序列化
    hbook = BookInfoSerializer(read_only=True)

    class Meta:
        model = HeroInfo
        fields = "__all__"

    def create(self, validated_data):
        # 因为视图类继承的GenericAPIView不是APIView,所以会默认传递context参数给序列化器对象
        # self.context是个字典,里面传递过来了三个键值对request, format, view
        # request.data就可以拿到前端传递过来的数据,request.data也是一个字典
        hbook_id = self.context["request"].data["hbook"]
        print(type(hbook_id), hbook_id)
        hero = HeroInfo()
        hero.hname = validated_data["hname"]
        hero.hcommon = validated_data["hcommon"]
        hero.hbook_id = hbook_id
        hero.save()
        return hero

2. 视图类

from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView

from .models import BookInfo, HeroInfo
from .serializers import BookInfoSerializer, HeroInfoSerializer


class GBookListAPIView(ListCreateAPIView):
    """列表视图"""
    # 指定查询集、序列化器类
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer


class GBookDetailAPIView(RetrieveUpdateDestroyAPIView):
    """详情视图"""
    # 指定查询集和序列化器
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer


class GHeroListAPIView(ListCreateAPIView):
    queryset = HeroInfo.objects.all()
    serializer_class = HeroInfoSerializer


class GHeroDetailAPIView(RetrieveUpdateDestroyAPIView):
    queryset = HeroInfo.objects.all()
    serializer_class = HeroInfoSerializer

猜你喜欢

转载自blog.csdn.net/weixin_42289273/article/details/114176676