0

私がやろうとしているのは、Pyramid、SQLAlchemy を使用した単純なブログ Web サイトです。私が選んだフォームモジュールは Coland を使った Deform です。したがって、今のところフォームにはnameurlの 2 つのフィールドがあります。Url は名前フィールドを音訳で作成しますが、気にしません。したがって、同じ URL を持つ 2 つの記事を作成したくありません。どういうわけかCollandでバリデーターを作る必要があると思います。しかし問題は、バリデータがフィールドごとに実行され、モデル レコードごとに実行されないことです。つまり、urlフィールドのバリデーターを作成すると、メソッドにidnameなどの別のフィールドに関する情報がないため、検証を実行できませんでした。

今のところ、2 時間かけて作成した文字列がいくつかあります =)

from slugify import slugify

def convertUrl(val):
    return slugify(val) if val else val


class ArticleForm(colander.MappingSchema):
    name = colander.SchemaNode(colander.String())
    url = colander.SchemaNode(colander.String(),
                              preparer=convertUrl)

実際には、モデル レベル、つまり SQLAlchemy モデルでこのような検証を実行する必要があると考えましたが、もちろんそれ以上のルールは機能しません。そのようなルールは主に SQL スクリプト (CREATE TABLE) を作成するために存在するためです。

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

    id = Column(Integer, primary_key=True)
    name = Column(Text, unique=True)
    url = Column(Text, unique=True)
4

1 に答える 1

0

実際、私の質問は Deform にも Colander にも言及していません。この検証は SQLAlchemy レベルで実行する必要があります。

@validates('url')
def validate_url_unique(self, key, value):
    check_unique = DBSession.query(Article)\
        .filter(and_(Article.url == value, Article.id != self.id)).first()

    if check_unique:
        # Doesn't work
        raise ValueError('Something went wrong')

    # Neither doesn't work
    # assert not check_unique

    return value
于 2014-01-05T17:29:36.813 に答える