当前位置: 首页 > 科技观察

Pythonweb框架中如何使用序列化器

时间:2023-03-16 20:43:35 科技观察

DjangoSerialization用于将数据转换成便于存储或传输的格式,然后重构以供使用。DRF是最著名的序列化程序。序列化是将数据转换成可以存储或传输的格式,然后再进行重构的过程。在开发应用程序或将数据存储在数据库、内存或将其转换为文件时,它一直被使用。我最近帮助Labcodes的两名初级开发人员了解序列化程序,并认为我会与各位读者分享我的方法。假设您正在编写一个电子商务网站,并且您有一个订单记录有人在特定日期以特定价格购买了产品:product=productself.customer=customerself.price=priceself.date=date现在,假设您要从键值数据库中存储和检索订单数据。幸运的是,它的接口接受并返回字典,因此您需要将对象转换为字典:price,'date':order.date}如果你想从数据库中获取一些数据,你可以获取字典数据并将其转换为订单对象(Order):defdeserialize_order(order_data):returnOrder(product=order_data['product'],customer=order_data['customer'],price=order_data['price'],date=order_data['date'],)对于简单的数据来说相当简单,但是当你需要处理一些数据时这种方法不适用于由复杂属性构成的复杂对象。您还需要处理不同类型字段的验证,这需要大量的手动工作。这时候框架的序列化就可以非常方便的派上用场了。它们允许您使用少量模板创建序列化器,这将适用于复杂的情况。Django提供了一个序列化模块,允许您将模型“转换”为其他格式:fromdjango.coreimportserializersserializers.serialize('json',Order.objects.all())涵盖了web应用程序使用的最常见类型,例如JSON、YAML和XML。但您也可以使用第三方序列化程序或创建您自己的序列化程序。您只需要在settings.py文件中注册它:#settings.pySERIALIZATION_MODULES={'my_format':appname.serializers.MyFormatSerializer,}要创建您自己的MyFormatSerializer,您需要实现.serialize()方法并接受一个查询集和其他选项作为参数:classMyFormatSerializer:defserialize(self,queryset,**options):#seriousserializationhappening现在,您可以将查询集序列化为新格式:fromdjango.coreimportserializersserializers.serialize('my_format',Order.objects.all())您可以使用选项参数来定义序列化程序的行为。比如你想定义在处理ForeignKeys时使用嵌套序列化,或者你只想让数据返回它的主键,你可以传入一个flat=True参数作为选项,在方法中处理:classMyFormatSerializer:defserializer(self,queryset,**options):ifoptions.get('flat',False):#不要递归序列化关系#递归序列化关系使用Django序列化的一种方法是使用loaddata和转储数据管理命令。DRF序列化器在Django社区中,DjangoRESTFramework(DRF)提供了最著名的序列化器。虽然您可以使用Django的序列化程序构建将在API中响应的JSON,但REST框架中的序列化程序提供了更好的功能,可帮助您处理和轻松验证复杂数据。在订单示例中,您可以像这样创建序列化程序:fromrestframeworkimportserializersclassOrderSerializer(serializers.Serializer):product=serializers.CharField(max_length=255)customer=serializers.CharField(max_lenght=255)price=serializers.DecimalField(max_digits=5,decimal_places=2)date=serializers.DateField()轻松序列化其数据:order=Order('pen','renato',10.50,date.today())serializer=OrderSerializer(order)serializer.data#{'product':'pen','customer':'renato','price':'10.50','date':'2020-08-16'}为了能够从数据中返回一个实例,你需要实现两种方法:创建和更新:fromrest_frameworkimportserializersclassOrderSerializer(serializers.Serializer):product=serializers.CharField(max_length=255)customer=serializers.CharField(max_length=255)price=serializers.DecimalField(max_digits=5,decimal_places=2)date=serializers.DateField()defcreate(self,validated_data):#执行订单创建returnorderdefupdate(self,instance,validated_data):#执行实例更新实例返回后,可以调用is_valid()来验证数据,通过调用save()创建或更新实例:它通常需要处理来自数据库(即您创建的模型)的数据。与ModelSerializer一样,ModelSerializer提供了一个用于从模型创建序列化程序的API。假设你有一个订单模型:fromdjango.dbimportmodelsclassOrder(models.Model):product=models.CharField(max_length=255)customer=models.CharField(max_length=255)price=models.DecimalField(max_digits=5,decimal_places=2)date=models.DateField()你可以像这样为它创建一个序列化器:fromrest_frameworkimportserializersclassOrderSerializer(serializers.ModelSerializer):classMeta:model=Orderfields='__all__'优化器包含所有模型字段并创建创建和更新方法。在基于类的视图(CBV)中使用序列化器就像DjangoCBV中的表单一样,序列化器与DRF很好地集成。您可以设置serializer_class属性以方便在视图中使用序列化程序:fromrest_frameworkimportgenericsclassOrderListCreateAPIView(generics.ListCreateAPIView):queryset=Order.objects.all()serializer_class=OrderSerializer您还可以定义get_serializer_class()方法:fromrest_frameworkimportgenericsAPIOrderListViewCreate(generics.ListCreateAPIView):queryset=Order.objects.all()defget_serializer_class(self):ifis_free_order():returnFreeOrderSerializerreturnOrderSerializerCBV中还有其他方法可以与序列化器交互。例如,get_serializer()返回一个实例化的序列化器,get_serializer_context()返回创建实例时传递给序列化器的参数。对于创建或更新数据的视图,有create和update,使用is_valid方法验证数据,perform_create和perform_update,调用serializer的save方法。了解更多有关更多资源,请参阅我的朋友AndréEricson的经典DjangoREST框架站点。它是基于类的经典视图的REST框架版本,可让您深入了解构成DRF的类。当然,官方文档也是一个很好的资源。