【问题标题】:How to check if NDB model is valid如何检查 NDB 模型是否有效
【发布时间】:2014-02-27 21:54:23
【问题描述】:

我有一个模型类,例如:

class Book(ndb.Model):
    title = ndb.StringProperty(required=True)
    author = ndb.StringProperty(required=True)

我有一些代码使用这个:

    book = Book()
    print book
    >> Book()
    book_key = book.put()
    >> BadValueError: Entity has uninitialized properties: author, title

有没有办法在保存之前检查模型是否有效?

并找出哪个属性无效以及错误类型(例如,必需)。 如果您有结构化财产,那么这将如何运作?

基本上是在寻找如何正确验证模型类...

【问题讨论】:

  • 我认为如果这很重要的话,在保存它之前也应该去标题..因为否则你可以简单地try/except我猜..
  • 重复:看看 Guido 的回答:stackoverflow.com/questions/15200952/…
  • @voscausa 由同一个 OP :)

标签: python google-app-engine app-engine-ndb


【解决方案1】:

下面的方法不起作用!
我后来遇到问题。我现在不记得是什么了。


我还没有找到这样做的“官方”方式。 这是我的解决方法:

class Credentials(ndb.Model):
    """
    Login credentials for a bank account.
    """
    username = ndb.StringProperty(required=True)
    password = ndb.StringProperty(required=True)

    def __init__(self, *args, **kwds):
        super(Credentials, self).__init__(*args, **kwds)
        self._validate()   # call my own validation here!

    def _validate(self):
        """
        Validate all properties and your own model.
        """
        for name, prop in self._properties.iteritems():
            value = getattr(self, name, None)
            prop._do_validate(value)
        # Do you own validations at the model level below.

重载__init__ 以调用我自己的_validate 函数。 在那里,我为每个属性调用_do_validate,并最终进行模型级验证。

为此打开了一个错误:issue 177

【讨论】:

    【解决方案2】:

    模型有效,但您已指定titleauthor 都是必需的。因此,每次写入内容时,您都必须为这些属性提供值。 基本上你正在尝试写一个空记录。

    尝试:

    book = Book()
    title = "Programming Google App Engine"
    author = "Dan Sanderson"
    book_key = book.put()
    

    【讨论】:

      【解决方案3】:

      您可以尝试使用 NDB 在引发 BadValueError 时使用的验证方法。

      book = Book()
      book._check_initialized()
      

      这将引发BadValueError,就像您尝试将条目放入数据存储区时一样。

      【讨论】:

        猜你喜欢
        • 2010-12-20
        • 2011-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-24
        相关资源
        最近更新 更多