【问题标题】:Django Rest Framework group fieldsDjango Rest Framework 组字段
【发布时间】:2021-09-03 01:27:58
【问题描述】:

我正在为旧版应用程序公开一个 REST api。

我有一个公司模型类,它定义了以下字段:

  • address_street(必填)
  • address_street_number(必填)
  • shipping_address_street(可选)
  • shipping_address_street_number(可选)
  • billing_address_street(可选)
  • ...你明白了

我想将所有地址字段分组到一个地址序列化程序中,以使结构更清晰。 比如:

{
  "adress": {"street": "foo", "street_number": "bar"},
  "shipping_address": {"street": "ham", "street_number": "spam"},
  "billing_address": null,
}

到目前为止,我可以从 rest_framework.serializers.Serializer 创建一个 CompanySerializer 并从中手动构建我的 Company 对象。 这很乏味,但它会起作用。

但是如何为我的 Company 模型构建 rest_framework.serializers.ModelSerializer,改变字段的结构方式,让我的模型字段由 rest 框架自动填充?

DRF nested model serializers 似乎只适用于关系,而不适用于字段组。

我是手动构建模型实例还是有办法将模型序列化程序的表示与我的对象解耦?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    来自ModelSerializerdocumentation

    The process of automatically determining a set of serializer fields
     based on the model fields is reasonably complex
    

    您可能应该坚持您提到的“乏味”方法(如果序列化器表示和模型字段具有完全不同的结构,您将不得不付出一些努力)。

    ModelSerializer 与相关模型紧密相关,因此当您可以使用普通的 Serializer 执行相同操作并将对象创建置于 save 下时,覆盖该行为似乎没有什么好处。

    也许您需要覆盖 Serializer 子类上的 data 属性/方法,以便获得适合模型直接使用的 dict,这可能会使其不那么乏味

    【讨论】:

      【解决方案2】:

      您可以使用 SerializerMethodField 构建自定义序列化器字段:

      from rest_framework.fields import SerializerMethodField
      
      class AdressSerializer(ModelSerializer):
          adress = SerializerMethodField()
          shipping_address = SerializerMethodField()
      
          def get_adress(self, instance):
            return {
                "street": instance.address_street, 
                "street_number": instance.address_street_number
              }
      
          def get_shipping_address(self, instance):
             // same approach as above
      

      如果需要从相同的数据表示填充模型,最好的方法是覆盖序列化器的save 方法。我不认为有一种“自动”的方式来做到这一点。

      【讨论】:

        猜你喜欢
        • 2013-01-15
        • 2017-08-29
        • 2015-09-19
        • 1970-01-01
        • 1970-01-01
        • 2016-09-18
        • 1970-01-01
        • 2018-10-03
        • 2018-08-07
        相关资源
        最近更新 更多