【问题标题】:Make serializer for nested values in Django rest serializer在 Django rest 序列化器中为嵌套值制作序列化器
【发布时间】:2016-02-05 03:27:49
【问题描述】:

我正在尝试将我的 django 项目与 mailchimp 的 api 集成,以将用户添加到列表中,我需要生成一些以下格式的 json:

{
  "email_address": "EMAIL",
  "status": "subscribed",
  "merge_fields": {
    "FNAME": "FIRST_NAME",
    "LNAME": "SURNAME"
  },

遗憾的是,我在使用嵌套的 merge_field 时遇到了一些困难。我希望以下工作:

class MergeSerializer(serializers.Serializer):
    FNAME = serializers.SerializerMethodField('get_first_name')
    LNAME = serializers.SerializerMethodField('get_surname')

    def get_first_name(self, obj):
        return obj.first_name

    def get_surname(self, obj):
        return obj.surname

class CreateContactSerializer(serializers.Serializer):
    email_address = serializers.EmailField()
    status = serializers.SerializerMethodField('get_alternative_status')
    merge_fields = MergeSerializer(read_only=True)

    def get_alternative_status(self, obj):
        return "subscribed"

这只会生成一些带有 email_address 和 status 的 json,并且完全忽略了 merge_fields。几个小时后,我完全不知道下一步该尝试什么。有人知道如何解决这个问题吗?

因为我认为 marshmallow 框架的文档更清晰一些,所以我也用他们的包进行了尝试,但是返回的结果完全相同(所以忽略了我的 merge_fields):

class MergeFieldsSchema(Schema):
    FNAME = fields.String(attribute="first_name")
    LNAME = fields.String(attribute="surname")


class CreateContactSerializer(Schema):
    merge_fields = fields.Nested(MergeFieldsSchema)
    email_address = fields.String()
    status = fields.Constant("subscribed")

【问题讨论】:

  • 如何将数据模型附加到序列化程序并查看...?

标签: python json django serialization django-rest-framework


【解决方案1】:

您没有这样说,但我假设 surname 和 first_name 也是模型上 email_address 的同一对象的一部分,这就是嵌套序列化程序不起作用的原因(因为嵌套序列化程序用于外键)。如果不是这种情况,请将模型添加到 OP。

因为你只是想自定义输出,你可以在你的主CreateContactSerializer上使用一个序列化器方法:

class CreateContactSerializer(serializers.Serializer):
    email_address = serializers.EmailField()
    status = serializers.SerializerMethodField('get_alternative_status')
    merge_fields = serializers.SerializerMethodField('get_merge_fields')

    def get_alternative_status(self, obj):
        return "subscribed"

    def get_merge_fields(self, obj):
        return {
            "FNAME": obj.first_name,
            "LNAME": obj.surname
        }

如果你愿意,你甚至可以重用你已经使用过的序列化器并做

def get_merge_fields(self, obj):
    serializer = MergeSerializer(obj)
    return serializer.data;

不要忘记将 merge_fields 添加到您的 fields

【讨论】:

    猜你喜欢
    • 2020-04-23
    • 2017-07-28
    • 2018-06-23
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 2017-11-15
    • 2015-03-20
    相关资源
    最近更新 更多