串行器设计?我什么时候需要新的序列化器?

时间:2019-03-08 14:08:16

标签: serialization django-rest-framework

在DRF中,我经常遇到天气问题,是否应该为特定视图创建自定义序列化程序。总是想弄清楚现有的序列化程序是否可以修改以执行我想要的操作。

示例:

class ProductReviewSerializer(serializers.ModelSerializer):

    product_name = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = ProductReview
        fields = (
            'uuid',
            'review_score',
            'user',
            'product',
        )
        read_only_fields = (
            'uuid',
        )

    def get_product_name(self, obj):
        something ...

我正在使用此序列化程序来创建ProductReview的新实例。此外,我也想使用此序列化程序来更新ProductReview的实例。为此,序列化程序应验证来自API端点的数据,该端点忽略了许多字段,例如。 G。 DRF API仅接收JSON {review_score: 2)。对于给定的示例,除非我将一堆字段声明为read_only,否则序列化器才有效,这反过来对创建新实例无效。

用于编辑ProductReviews的序列化程序,该序列化程序从上方接受数据({review_score: ...}),看起来像这样:

class ProductReviewEditSerializer(serializers.ModelSerializer):

    class Meta:
        model = ProductReview
        fields = (
            'review_score',
        )

我觉得我在这里制造了一些愚蠢的设计缺陷。但是您能指出我一个更好的解决方案的方向吗?

创建大量单独的序列化程序是走的路吗?我的直觉告诉我,每个模型都应该只有一个序列化器...

1 个答案:

答案 0 :(得分:1)

实际上,这是一个很好的问题。我在分享应该使用序列化程序时的观点。读出其他人对此的想法将是很棒的。

为什么需要序列化器

  1. 最重要的原因是我们不总是永远相信用户输入的内容。可能存在一些恶意企图危害系统。因此,在对我们的模型/系统进行任何更改之前,我们应始终以尽可能完美的方式验证用户数据。
  2. 我们希望我们以完善的格式做出回应。可能需要在正常的数据库查询响应旁边添加几个逻辑操作。

单个串行器可以完成所有可能的工作

我坚信大多数情况下都有可能。仍然有一些情况是不可能的。我发现DRF-ModelSerializer非常适合这项工作,而且组织得很好。如果您的模型定义正确组织。如果需要任何其他的get响应,我们可以始终为该作业使用SerializerMethodField

可能的解决方案

我打算不要传递要用请求数据更新的模型实例。对于使用序列化进行部分更新,我们应该执行以下操作

serializer = ProductReviewSerializer(product_review_model_instance, data=request.data, partial=True)