序列化
#1.用来序列化数据。ORM-JSON
#2.用来验证表单数据。Form
#3.可以创建数据,修改数据等
Serializer的构造函数的两个参数: #1.instance 需要传递一个ORM对象,或者是一个queryset对象,用来将orm模型序列化成JSON的。 #2.data 把需要验证的数据传递给data,用来验证这些数据是不是符合要求。
#3.many 如果instance是一个queryset对象,那么many=True
class MerchantSerializer(serializers.Serializer): id serializers.IntegerField(read_only=True) name serializers.CharField(max_length=200,required=True,error_message={"required":"name为必须传的参数"}) logo serializers.CharField(max_length=200,required=True) address serializers.CharField(max_length=200,required=True) notice serializers.CharField(max_length=200,required=False) up_send serializers.DecimalField(required=False,max_digits=6,decimal_places=2) lon serializers.FloatField(required=True) lat serializers.FloatField(required=True) def update(self,instance,validated_data): instance.name validated_data.get('name',instance.name) instance.logo validated_data.get('logo',instance.logo) instance.address validated_data.get('address',instance.address) instance.notice validated_data.get('notice',instance.notice) instance.up_send validated_data.get('up_send',instance.up_send) instance.lon validated_data.get('lon',instance.lon) instance.lat validated_data.get('lat',instance.lat) instance.save() return instance def create(self,validated_data): #**可以把{"name":"zhangsan"}改成name=zhangsan的形式 return Merchant.objects.create**validated_data)
views.py:
from .models import Merchant from .serializers import MerchantSerializer from django.http.response import JsonResponse from django.views.decorators.http import require_http_methods @require_http_methods(['GET','POST']) def merchant(request): if request.method == 'GET': merchants = Merchant.objects.all() serializer = MerchantSerializer(merchants,many=True) return JsonResponse(serializer.data,safe=False) else: serializer = MerchantSerializer(data=request.POST) if serializer.is_valid(): serializer.save() return JsonResponse(serializer.data,status=200) return JsonResponse(serializer.errors,status=400)
from django.urls import path from .views import merchant GET、POST请求均可以 urlpatterns=[ path('/merchant/',merchant,name="merchant") ]
序列化嵌套
有时候在一个序列化中,我们可能需要其他模型的序列化。这时候就可以使用到序列化的嵌套。比如我们在GoodsCategory中想要获取Merchant以及这个分类下的商品Goods(只是为了演示,实际情况不一定要全部返回)。那么示例代码如下
class GoodsSerializer(serializers.ModelSerializer): class Meta: model = Goods fields = "__all__" class MerchantSerializer(serializers.ModelSerializer): class Meta: model = Merchant fields = "__all__" class GoodsCategorySerializer(serializers.ModelSerializer): merchant = MerchantSerializer(read_only=True,required=False) goods_list = GoodsSerializer(many=True,required=False) merchant_id = serializers.IntegerField(required=True,write_only=True) class Meta: model = GoodsCategory fields = "__all__" def validate_merchant_id(self,value): if not Merchant.objects.filter(pk=value).exists(): raise serializers.ValidationError("商家不存在!") return value def create(self, validated_data): merchant_id = validated_data.get('merchant_id') merchant = Merchant.objects.get(pk=merchant_id) category = GoodsCategory.objects.create(name=validated_data.get('name'), merchant=merchant) return category
@require_http_methods(['GET','POST']) def goods_category(request): if request.method == 'GET': categories = GoodsCategory.objects.all() serializer = GoodsCategorySerializer(categories,many=True) return JsonResponse(serializer.data,safe=False) else: serializer = GoodsCategorySerializer(data=request.POST) if serializer.is_valid(): serializer.save() return JsonResponse(serializer.data) else: return JsonResponse(serializer.errors,status=400)
继承generics.GenericAPIView之后视图里就可以
queryset = Api.objects.all()
serializer_class = ApiSerializer
from rest_framework.decorators import action class MerchantViewSet(viewsets.ModelViewSet): queryset = Merchant.objects.all() serializer_class = MerchantSerializer detail是指的是id,False是不指定 @action(['GET'],detail=False) def cs(self,request,*args,**kwargs): queryset = self.get_queryset() queryset = queryset.filter(name__contains="长沙") serializer = MerchantSerializer(queryset,many=True) return Response(serializer.data)
撸起袖子加油干!!!
分类:
rest_framework
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2018-06-09 centos django+Nginx+uwsgi部署
2018-06-09 centos下运行python3.6+Django+mysql项目
2018-06-09 centos虚拟机下安装nginx