我从Google App Engine和验证器获得了ndb模型。但是,当我使用邮递员尝试验证并从邮递员生成的字符串中强制执行int时。我仍然收到BadValueError:BadValueError: Expected integer, got u'2'

出什么事了?

def int_validator(prop, val):
    if val:
        val = int(val)
        return val

class TwitterUser(ndb.Model):
    """Model for twitter users"""
    screen_name = ndb.StringProperty(required=True)
    followers_count = ndb.IntegerProperty(validator=int_validator)

最佳答案

ndb.IntegerProperty_validate()方法will run before your custom validator,并因此引发异常。

为了使代码正常工作,您需要使用ndb.Property或从ndb.IntegerProperty继承并用您的方法覆盖其_validate()方法。

第一个解决方案如下所示:

def int_validator(prop, val):
    if val:
        val = int(val)
        return val

class TwitterUser(ndb.Model):
    """Model for twitter users"""
    screen_name = ndb.StringProperty(required=True)
    followers_count = ndb.Property(validator=int_validator)


第二个是这样的:

class CustomIntegerProperty(ndb.IntegerProperty):
    def _validate(self, value):
        if val:
            val = int(val)
            return val
        # you still need to return something here or raise an exception

class TwitterUser(ndb.Model):
    """Model for twitter users"""
    screen_name = ndb.StringProperty(required=True)
    followers_count = ndb.CustomIntegerProperty()


我认为这都不是理想的解决方案,因为您最好只是确保将int传递给followers_count属性,并为BadValueError装上以防万一。

09-05 19:21