扩展 Marshmallow 架构但覆盖字段必需属性

问题描述 投票:0回答:3

菜鸟问题,但我有一个简单的模式:

class User(Schema):
    name = fields.Str(required=True)
    email = fields.Str(required=True)

我想扩展它,但在扩展的情况下,使一个字段可选

class UserIHavePhoneNumberFor(User):
    phone = fields.Str(required=True)
    # Don't Care about Email because I can pester them via phone!

我已经检查了文档,但找不到方法来做到这一点。 有什么帮助吗?

谢谢!

python inheritance marshmallow
3个回答
3
投票

它可能不在文档中,因为这些只是 python 中的基本类继承规则。

class UserIHavePhoneNumberFor(User):
    phone = fields.Str(required=True)
    email = fields.Str(required=False)

如果您需要比这更复杂的规则,您始终可以编写自己的自定义验证规则:

https://marshmallow.readthedocs.io/en/stable/extending.html#raise-errors-in-pre-post-processor-methods

甚至:

https://marshmallow.readthedocs.io/en/stable/extending.html#schema-level-validation

通常最好先尝试看看是否可以通过聪明地声明字段来避免使用这些字段,但当你需要它时它就在那里。


0
投票

就我个人而言,我会像这样完全改变类结构:

class User(Schema):
    name = fields.Str(required=True)
    email = fields.Str()
    phone = fields.Str()
    
    @validates_schema
    def validate_numbers(self, data, **kwargs):
        if not (data.get("phone") or data.get("email")):
            raise ValidationError("Phone or email must be provided").

不需要额外的模式,并且与继承不同,这不会破坏LSP;起初你说任何

User
都必须有电子邮件,但后来有些孩子违反了这一规则。

从纯粹的 OOP 角度来看,这可能是正确的方法。


-1
投票

您正在寻找部分加载吗?

跳过

required=True
验证

https://marshmallow.readthedocs.io/en/stable/quickstart.html#partial-loading

© www.soinside.com 2019 - 2024. All rights reserved.