我遇到了问题,希望有人能指出正确的方向。 我想使用棉花糖来验证具有嵌套模式的结构。 这是一个示例:
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
。
答案 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": {}
}