【问题标题】:Are ModelSerializers meant to be written on a per-view basis?ModelSerializers 是否意味着按视图编写?
【发布时间】:2018-07-12 09:43:20
【问题描述】:

我正在编写一个 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)

我对这些场景有看法。

  • 创建:用户输入field1field2field3 将根据它被填充和保存
  • 显示:只有field2 将显示在匹配查询集中的每个模型上
  • show_full:field2field3 都将显示在匹配查询集中的每个模型上

这让我想到了我的问题。我应该为上述所有视图各写一个ModelSerializer 吗?或者 DRF 是否有一些工具可以在视图本身中指定模型字段名称?如果序列化程序是基于每个视图编写的,那么序列化程序与视图的联系不是比模型更紧密吗?

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

【问题讨论】:

    标签: python json django django-rest-framework


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多