用“data_key”定义的 Marshmallow 字段和用“attribute”定义的 Marshmallow 字段有什么区别(标识符颠倒了?)

What is the difference between a Marshmallow field defined with `data_key` and one defined with `attribute` (with the identifiers reversed?)

marshmallow.Schema (v3.0+) 中名称为 foo 的字段定义为 attribute="bar" 与另一个名称为 [= 的字段之间是否存在差异15=] 定义为 data_key="foo"?

两者似乎都以相同的方式序列化和反序列化字典和其他简单对象:

import marshmallow

class MySchema1(marshmallow.Schema):
    foo = marshmallow.fields.String(attribute="bar")

class MySchema2(marshmallow.Schema):
    bar = marshmallow.fields.String(data_key="foo")

schema1 = MySchema1()
schema2 = MySchema2()

dictionary = {"bar": "hello world"}
assert schema1.dump(dictionary) == schema2.dump(dictionary)
assert schema1.load(schema1.dump(dictionary)) == schema2.load(schema2.dump(dictionary))

class Thingy:
    def __init__(self):
        self.bar = "hello world"

instance = Thingy()
assert schema1.dump(instance) == schema2.dump(instance)
assert schema1.load(schema1.dump(instance)) == schema2.load(schema2.dump(instance))

以上通过。这目前不会在我的项目中造成任何错误,但我很好奇有什么区别!提前致谢。

你是对的。两种模式的行为相同。

这可能被视为多余 API:从您的示例中,您可能想知道如果 data_key 提供相同的功能,为什么还要 attribute

实际上,同时拥有两者很有用,因为它允许指定无效的键 python 加载键和转储键的变量名。

class MySchema(marshmallow.Schema):
    foo = marshmallow.fields.String(attribute="bar-load", "data_key"="bar-dump")

AFAIK,这就是我们没有在棉花糖中加入 attribute 的原因。可能还有其他原因,但这一个似乎已经很好了。