2013-12-21 50 views
4

如何在SQLAlchemy中獲取所需的驗證器?其實我只是想確信用戶在表單中填寫了所有必填字段。我使用PostgreSQL,但它沒有任何意義,因爲從對象在我的models.py文件中創建的表:SQLAlchemy中的驗證

from sqlalchemy import (
    Column, 
    Integer, 
    Text, 
    DateTime, 
    ) 

from sqlalchemy.ext.declarative import declarative_base 

from sqlalchemy.orm import (
    scoped_session, 
    sessionmaker, 
    ) 

from zope.sqlalchemy import ZopeTransactionExtension 

from pyramid.security import (
    Allow, 
    Everyone, 
    ) 

Base = declarative_base() 


class Article(Base): 
    """ The SQLAlchemy declarative model class for a Article object. """ 
    __tablename__ = 'article' 

    id = Column(Integer, primary_key=True) 
    name = Column(Text, nullable=False, unique=True) 
    url = Column(Text, nullable=False, unique=True) 
    title = Column(Text) 
    preview = Column(Text) 
    content = Column(Text) 
    cat_id = Column(Integer, nullable=False) 
    views = Column(Integer) 
    popular = Column(Integer) 
    created = Column(DateTime) 

    def __unicode__(self): 
     return unicode(self.name) 

所以這nullable=False不起作用,因爲記錄與空字段任何情況下加。例如,我可以通過設置名稱將數據庫級別的限制設置爲NOT NULL。但是在SQLAlchemy中必須有關於驗證的事情是不是?我來自yii php框架,那裏根本就沒有問題。

+2

請記住,SQLAlchemy的是沒有設計成一個驗證框架:相反,它是一個數據庫工具包,可以另外用作ORM。類似'nullable'參數的東西可以幫助您獲取SQLAlchemy來生成SQL CREATE腳本(將列設置爲NOT NULL)。因此,SQLAlchemy被設計爲將驗證問題留給你(使用'validates',如下所述),數據庫本身(比如使用'CheckConstraint')或其他軟件(如[WTForms](http:// wtforms .readthedocs.org/EN /最新/))。 –

回答

9

通過空字段我想你的意思是一個空字符串而不是NULL。一個simple method是添加驗證,如:

class Article(Base): 
    ... 
    name = Column(Text, nullable=False, unique=True) 
    ... 

    @validates('name') 
    def validate_name(self, key, value): 
     assert value != '' 
     return value 

要在數據庫級別實現它你也可以使用一個check constraint,只要數據庫支持:

class Article(Base): 
    ... 
    name = Column(Text, CheckConstraint('name!=""') 
    ... 
+0

謝謝你的哥們。它運行良好。但實際上,我不知道如何識別哪個驗證器已在views.py中被解僱?我只能聽到AssertionError,但是沒有關於哪個字段錯誤的信息。 –

+1

因此,無論是引發自定義例外還是添加錯誤消息,例如'assert name!='','名稱不能爲空'或'if name =='';引發NyNameError' – aquavitae

+0

需要記住的一件重要事情是,驗證裝飾器函數只在設置屬性時驗證屬性。如果您創建了一篇文章,並且您沒有在代碼中設置該名稱,那麼裝飾的驗證函數將永遠不會被觸發,並且它會將該記錄插入數據庫,而name屬性沒有值。 –