在棉花糖中将嵌套模式与allow_blank一起使用

时间:2020-07-23 19:10:58

标签: python validation nested marshmallow

我遇到了问题,希望有人能指出正确的方向。 我想使用棉花糖来验证具有嵌套模式的结构。 这是一个示例:

from marshmallow import Schema, fields
class userAddress(Schema):
    street = fields.Str(required=True)
    city = fields.Str(required=False)
    zipcode = fields.Int(required=True)
    

class user(Schema):
    name = fields.Str(required=True)
    address = fields.Nested(userAddress, required=False, allow_none=True, allow_blank=True)

user_instance = user()

user_data1 = {
    "name": "John Doe",
    "address": {
        "street": "Road to nowhere",
        "city": "St. Elsewhere",
        "zipcode": 666
    }
}

user_data2 = {
    "name": "John Doe, Jr.",
    "address": {}
}

我想实现的是,两个user_data dict都经过了验证,没有问题。如果存在密钥address,则相应的字典应与模式userAddress中的定义匹配。但是,如果不存在键address或该值是空字典,则可以接受。

但是这不起作用,结果如下:

>>> user_instance.validate(user_data1)
{}
>>> user_instance.validate(user_data2)
{'address': {'zipcode': ['Missing data for required field.'], 'street': ['Missing data for required field.']}}
>>>

不接受user_data2中address的空字典。

我尝试在partial=True中使用validate,但随后也接受缺少的name

1 个答案:

答案 0 :(得分:0)

尝试使用fields.Raw()而不是Nested()

from marshmallow import Schema, fields
class userAddress(Schema):
    street = fields.Str(required=True)
    city = fields.Str(required=False)
    zipcode = fields.Int(required=True)
    

class user(Schema):
    name = fields.Str(required=True)
    address = fields.Raw(userAddress)

user_instance = user()

user_data1 = {
    "name": "John Doe",
    "address": {
        "street": "Road to nowhere",
        "city": "St. Elsewhere",
        "zipcode": 666
    }
}

user_data2 = {
    "name": "John Doe, Jr.",
    "address": {}
}