5.5.drf的modelserializer

serializer

goods/serializer.py

class GoodsCategorySerializer(serializers.Serializer):
    name = serializers.CharField(default='', max_length=30)
    code = serializers.CharField(default='', max_length=30)
    desc = serializers.CharField(default='', max_length=200)
    category_type = serializers.IntegerField()

    def create(self, validated_data):
        return GoodsCategory.objects.create(**validated_data)

goods/views.py

class GoodsCategoryView(APIView):
    """
    获取商品类型列表
    """

    def get(self, request, format=None):
        category = GoodsCategory.objects.all()[:10]
        serializer = GoodsCategorySerializer(category, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = GoodsCategorySerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

goods/urls.py

from django.urls import path

from goods.views import GoodsListView, GoodsCategoryView

urlpatterns = [
    ...
    path('category/', GoodsCategoryView.as_view(), name='goods_category'),
]

使用ModelSerializer简化Serializer

goods/serializer.py

class GoodsCategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = GoodsCategory
        fields = ('name', 'code', 'desc', 'add_time')

若需要取出所有字段使用fields = '__all__'

Serializer嵌套

class GoodsCategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = GoodsCategory
        fields = ('name', 'code', 'desc', 'add_time')

class GoodsSerializer(serializers.Serializer):
    category = GoodsCategorySerializer() # Serializer嵌套
    name = serializers.CharField(required=True, max_length=100)
    market_price = serializers.IntegerField(default=0.0)

    def create(self, validated_data):
        return Goods.objects.create(**validated_data)

结果

[
    {
        "category": {
            "name": "猪肉",
            "code": "pork",
            "desc": "猪肉",
            "add_time": "2020-10-19T15:39:47Z"
        },
        "name": "西班牙猪肉",
        "market_price": 0
    },
    ...
]

总所周知,drf中的serializer会为图片的url自动补全域名,但当Serializer嵌套Serializer时,图片的url自动补全域名将失效,若要开启需手动设置context={'request': self.context['request']}

class IndexCategorySerializer(serializers.ModelSerializer):
    def get_ad_goods(self, obj):
        goods_json = {}
        ad_goods = IndexAd.objects.filter(category_id=obj.id,)
        if ad_goods:
            good_ins = ad_goods[0].goods
            goods_json = GoodsSerializer(good_ins, many=False, context={'request': self.context['request']}).data
        return goods_json

使用场景

何时适用Serializer?何时使用ModelSerializer?

Model中要求某字段必须存在,可Serializer中却不需要时,使用Serializer

Last updated

Was this helpful?