怎么在Python Web框架Django中使用序列化器

技术怎么在Python Web框架Django中使用序列化器这篇文章主要讲解了“怎么在Python Web框架Django中使用序列化器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来

本文主要讲解“如何在Python Web Framework Django中使用序列化程序”,简单明了,易学易懂。请跟随边肖的思路学习“如何在Python Web Framework Django中使用序列化程序”。

序列化用于将数据转换为便于存储或传输的格式,然后重新构建以供使用。DRF是最著名的串行器。

序列化是将数据转换为可存储或传输的格式,然后对其进行重构的过程。它总是在开发应用程序或在数据库、内存中存储数据或将其转换为文件时使用。

最近帮助Labcodes的两位初级开发人员了解了序列化程序,我想我也可以把我的方法分享给读者。

假设您正在编写一个电子商务网站,您有一个订单,其中记录了某人在某个日期以某个价格购买了一个产品:

订单:def _ _ init _ _(自身、产品、客户、价格、日期):self。产品=产品本身。客户=customerself。价格=priceself。日期=日期现在,假设您想从键值数据库中存储和检索订单数据。幸运的是,它的接口可以接受和返回字典,因此您需要将对象转换为字典:

反序列化_订单(订单):返回{ '产品' :订单。产品,'客户' :订单。客户,‘价格’:订单。价格,'日期' :订单。日期}如果想从数据库中获取一些数据,可以获取字典数据,并将其转换为order对象(order。

def deserize _ order(order _ data): return order(product=order _ data[' product '],customer=order _ data[' customer '],price=order_data['price'],Date=order_data['date'],)这对于简单的数据来说非常简单,但是当需要处理一些由复杂属性组成的复杂对象时,这种方法就不能很好地扩展。您还需要处理不同类型字段的验证,这需要大量的手动工作。

此时,可以方便地使用框架的序列化。它们允许您使用少量模板创建序列化程序,这将适用于复杂的情况。

Django提供了一个序列化模块,允许您将模型“转换”为其他格式:

它涵盖了最常用的网络应用程序类型,如JSON、YAML和XML。但是您也可以使用第三方序列化程序或创建自己的序列化程序。你只需要在settings.py文件中。

注册它:

# settings.pySERIALIZATION_MODULES = {    'my_format': appname.serializers.MyFormatSerializer,}

要创建自己的 MyFormatSerializer,你需要实现 .serialize() 方法并接受一个查询集和其它选项作为参数:

class MyFormatSerializer:    def serialize(self, queryset, **options):        # serious serialization happening

现在,你可以将查询集序列化为新格式:

from django.core import serializers serializers.serialize('my_format', Order.objects.all())

你可以使用选项参数来定义序列化程序的行为。例如,如果要定义在处理 ForeignKeys 时要使用嵌套序列化,或者只希望数据返回其主键,你可以传递一个 flat=True 参数作为选项,并在方法中处理:

class MyFormatSerializer:    def serializer(self, queryset, **options):        if options.get('flat', False):            # don't recursively serialize relationships        # recursively serialize relationships

使用 Django 序列化的一种方法是使用 loaddata 和 dumpdata 管理命令。

DRF 序列化器

在 Django 社区中,Django REST 框架(DRF)提供了最著名的序列化器。尽管你可以使用 Django 的序列化器来构建将在 API 中响应的 JSON,但 REST 框架中的序列化器提供了更出色的功能,可以帮助你处理并轻松验证复杂的数据。

在订单的例子中,你可以像这样创建一个序列化器:

from restframework import serializers class OrderSerializer(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'}

为了能够从数据返回实例,你需要实现两个方法:create 和 update

from rest_framework import serializers class OrderSerializer(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()     def create(self, validated_data):        # 执行订单创建        return order     def update(self, instance, validated_data):       # 执行实例更新       return instance

之后,你可以通过调用 is_valid() 来验证数据,并通过调用 save() 来创建或更新实例:

serializer = OrderSerializer(**data)## 若要验证数据,在调用 save 之前必须执行serializer.is_valid()serializer.save()

模型序列化器

序列化数据时,通常需要从数据库(即你创建的模型)进行数据处理。ModelSerializer 与 ModelForm 一样,提供了一个 API,用于从模型创建序列化器。假设你有一个订单模型:

from django.db import models class Order(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()

你可以像这样为它创建一个序列化器:

from rest_framework import serializers class OrderSerializer(serializers.ModelSerializer):    class Meta:        model = Order        fields = '__all__'

Django 会自动在序列化器中包含所有模型字段,并创建 create 和 udpate 方法。

在基于类的视图(CBV)中使用序列化器

像 Django CBV 中的 Forms 一样,序列化器可以很好地与 DRF 集成。你可以设置 serializer_class 属性,方便序列化器用于视图:

from rest_framework import generics class OrderListCreateAPIView(generics.ListCreateAPIView):    queryset = Order.objects.all()    serializer_class = OrderSerializer

你也可以定义 get_serializer_class() 方法:

from rest_framework import generics class OrderListCreateAPIView(generics.ListCreateAPIView):    queryset = Order.objects.all()       def get_serializer_class(self):        if is_free_order():            return FreeOrderSerializer        return OrderSerializer

在 CBV 中还有其它与序列化器交互的方法。例如,get_serializer() 返回一个已经实例化的序列化器,get_serializer_context() 返回创建实例时传递给序列化器的参数。对于创建或更新数据的视图,有 create 和 update,它们使用 is_valid 方法验证数据,还有 perform_create 和 perform_update 调用序列化器的 save 方法。

感谢各位的阅读,以上就是“怎么在Python Web框架Django中使用序列化器”的内容了,经过本文的学习后,相信大家对怎么在Python Web框架Django中使用序列化器这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/42402.html

(0)

相关推荐

  • 如何理解NacosRibbonClientConfiguration

    技术如何理解NacosRibbonClientConfiguration今天就跟大家聊聊有关如何理解NacosRibbonClientConfiguration,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了

    攻略 2021年10月20日
  • 什么是python尾递归

    技术什么是python尾递归本篇内容主要讲解“什么是python尾递归”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是python尾递归”吧!递归是啥?递归函数大家肯定写

    攻略 2021年11月2日
  • 生茶,如何冲泡普洱生茶比较好

    技术生茶,如何冲泡普洱生茶比较好我是茶客闲品锦锦,很高兴回答你的问题:如何冲泡普洱茶生茶比较好生茶?普洱茶生茶市面上比较常见的以紧压茶为多见(砖、饼、沱),普洱茶冲泡如果条件允许的情况下最好选用紫砂壶冲泡,真正的紫砂壶透

    生活 2021年10月21日
  • Android Studio常用插件有哪些

    技术Android Studio常用插件有哪些小编给大家分享一下Android Studio常用插件有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了

    攻略 2021年11月23日
  • 污的句子,哪些词语以前不污 但现在很污

    技术污的句子,哪些词语以前不污 但现在很污其实压根就不是这些词语变污了 只是我们自己的思想变污了…… 记得那年污的句子,那时候的火腿是吃的
    肥皂是用的,木耳还是一道爽口菜
    黄瓜还是一种蔬菜,菊花也还美丽地绽放
    那时

    生活 2021年10月29日
  • Spring中spring-context-indexer依赖有什么用

    技术Spring中spring-context-indexer依赖有什么用这篇文章给大家分享的是有关Spring中spring-context-indexer依赖有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,

    攻略 2021年11月9日