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