ModelSerializers是否意味着基于每个视图编写?

时间:2018-02-01 23:22:02

标签: python json django django-rest-framework

我正在编写一个Django应用程序,它非常庞大且拥有大量API端点。此应用程序使用DRF序列化通过JSON发送到前端的信息,并反序列化从前端通过JSON发送的信息。

为了便于解释我的情况,让我们考虑一个简单的模型。所以,让我们说我有一个模型A

class A(models.Model):
    field1 = models.CharField(max_length=255)
    field2 = models.CharField(max_length=255)
    field3 = models.CharField(max_length=255)

我对这些场景有看法。

  • 创建:用户输入field1,根据将填充并保存field2field3
  • show:匹配查询集中的每个模型都只会显示field2
  • show_full:匹配查询集中的每个模型都会显示field2field3

这让我想到了我的问题。我应该为上面的所有观点分别写一个ModelSerializer吗?或者DRF是否有一些工具来在视图中指定模型字段名称?如果序列化程序是基于每个视图编写的,那么序列化程序与视图相比更多地与视图相关联吗?

感谢您帮助我。 DRF文档和任何数量的Google搜索都无法解决我的问题。

1 个答案:

答案 0 :(得分:1)

您不必为每个视图编写不同的序列化程序。相反,您可以使用它们的一些功能来实现您的目标:

1)要使用单个字段进行创建,请将field2field3标记为只读。这样,在创建模型时验证输入数据时,不会考虑它们。

2)要根据视图中输入的某些参数或不同视图决定显示哪些字段,您可以dynamically modify the fields of the serializer

class DynamicFieldsModelSerializer(serializers.ModelSerializer):
    """
    A ModelSerializer that takes an additional `fields` argument that
    controls which fields should be displayed.
    """

    def __init__(self, *args, **kwargs):
        # Don't pass the 'fields' arg up to the superclass
        fields = kwargs.pop('fields', None)

        # Instantiate the superclass normally
        super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)

        if fields is not None:
            # Drop any fields that are not specified in the `fields` argument.
            allowed = set(fields)
            existing = set(self.fields)
            for field_name in existing - allowed:
                self.fields.pop(field_name)