0

我想温和地强制用户群中的用户设置一个以前不需要但现在需要的值。

这是设置

从数据库中获取的用户会根据数据库绑定的棉花糖模式进行验证,这允许 None 值。

country = fields.String(validate=OneOf(COUNTRY_CODES), allow_none=True)

新用户根据不允许 None 的棉花糖模式进行验证。

country = fields.String(validate=OneOf(COUNTRY_CODES), allow_none=False)

已编辑的用户将根据另一个棉花糖模式进行验证,这是棘手的部分。

我希望不设置该字段也可以,如果以前未设置,但一旦设置,您应该无法将其删除。

这是如何在棉花糖中指定的?

4

1 回答 1

2

我可能误解了您的问题,但在我看来,用户是新用户还是现有用户,是架构外部的状态(因为架构是无状态的),因此需要将其传递给验证器. 在与您类似的情况下,我做了这样的事情:

from marshmallow import fields, validates_schema, Schema
from marshmallow.validate import OneOf
from marshmallow.exceptions import ValidationError

class Foo(Schema):
    country = fields.String(validate=OneOf(('A', 'B')), missing=None)

    # Some sort of hint that indicates if it's a new 
    # user or not. Could be record creation date, etc.
    new_user = fields.Boolean(missing=False)

    @validates_schema
    def check_country(self, instance):
        if instance['new_user'] and instance['country'] is None:
            raise ValidationError("count can not be none")

观察:

schema = Foo()

schema.load({})    
>>> UnmarshalResult(data={'new_user': False, 'country': None}, errors={})

schema.load({'new_user':True})    
>>> UnmarshalResult(data={'new_user': True, 'country': None}, errors={'_schema': ['count can not be none']})

schema.load({'new_user':True, 'country': 'A'})
>>> UnmarshalResult(data={'new_user': True, 'country': 'A'}, errors={})

schema.load({'new_user':False})
>>> UnmarshalResult(data={'new_user': False, 'country': None}, errors={})
于 2018-01-20T01:31:04.030 回答