【问题标题】:Unwrapping Compound Data with Django REST Framework Serializers使用 Django REST 框架序列化程序解包复合数据
【发布时间】:2014-07-01 20:13:12
【问题描述】:

如果我有一个看起来像这样的模型:

class Subject(models.Model):
    name_first = models.CharField(max_length=200)
    name_middle = models.CharField(max_length=200, blank=True)
    name_last = models.CharField(max_length=200)
    name_prefix = models.CharField(max_length=200, blank=True)
    name_suffix = models.CharField(max_length=200, blank=True)
    favorite_color = models.CharField(max_length=200)

我想反序列化这样发送的数据:

"name": {
            "prefix": "",
            "first": "John",
            "middle": "S",
            "last": "Smith",
            "suffix": ""
        },
  "favorite_color": "blue"

如何在 Django REST 框架中做到这一点?我宁愿不必介绍Name 模型。

【问题讨论】:

    标签: django django-models django-rest-framework


    【解决方案1】:

    您可以覆盖序列化程序上的 from_native 方法,修改 data 字典,使其在 Django REST 框架使用它创建实例之前匹配您的模型:

    class SubjectSerializer(serializers.ModelSerializer):
        class Meta:
            model = Subject
    
        def from_native(self, data, files):
            name_fields = data.pop('name', {})
            for key, val in name_fields.items():
                new_key = 'name_{0}'.format(key)
                data[new_key] = val
            return super(SubjectSerializer, self).from_native(data, files)
    

    请注意,这不会对传入数据的格式进行任何验证,因此根据您的情况,您可能需要防止有人提供字典以外的内容。例如,以下数据会导致异常:

    "name": "John Smith",
    "favorite_color": "blue"
    

    【讨论】:

      猜你喜欢
      • 2016-07-19
      • 2017-10-03
      • 2019-05-20
      • 2022-01-08
      • 2016-03-23
      • 2016-03-31
      • 2021-01-11
      • 1970-01-01
      • 2020-12-22
      相关资源
      最近更新 更多