9

このチュートリアルをガイドラインとして使用しています。http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-database

複数の商品をまとめられるカテゴリーが欲しいです。彼が複数の投稿を持つユーザーを持っている方法に似ています。

Pythonインタープリターを開いてカテゴリを作成しようとすると

>>>from app import db, models
>>>u = models.Category(name="Test")

このエラーが発生します

/sqlalchemy/orm/properties.py", line 1387, in _generate_backref
self, mapper))
sqlalchemy.exc.ArgumentError: Error creating backref 'category' on relationship 'Category.products': property of that name exists on mapper 'Mapper|Product|product'

したがって、後方参照に問題があります。チュートリアル (私は彼のコードで試しました) で、彼は同様の構文で User を作成することができます。

彼のすべてのファイルを使用して、新しいデータベースを作成して移行しようとしたところ、同じエラーが発生しました。

ここに私のmodels.pyファイルがあります:

from app import db

WR_IP_NO = 0
WR_IP_YES = 1

class Category(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(64), unique = True)
    products = db.relationship('Product', backref = 'category', lazy = 'dynamic')

    def __repr__(self):
        return '<Category %r>' % (self.name)

class Product(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    category = db.Column(db.String(64), db.ForeignKey('category.id'))
    courseName = db.Column(db.String(120), unique = True)
    ip = db.Column(db.SmallInteger, default = WR_IP_YES)
    duration = db.Column(db.Integer)
    productRev = db.Column(db.String(64))
    #use when database is updated?
    releaseDate = db.Column(db.DateTime)

    def __repr__(self):
        return '<Category> %r>' % (self.courseName)
4

1 に答える 1

14

衝突してしまったからです。エラーは次のとおりです。

`sqlalchemy.exc.ArgumentError: Error creating backref 'category' on relationship 'Category.products': property of that name exists on mapper 'Mapper|Product|product'`

双方向のリレーションシップを作成したことがわかります。そのためCategory、そのカテゴリに関連付けられているすべての製品を一覧表示するか、選択した製品のカテゴリを表示するように移動できます。Productcategory.productsproduct.category

しかし、あなたはすでに にcategoryプロパティを持っていますProduct。したがって、一意になるように変更してください。Product通常、クラスは次のようになります。

class Product(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    category_id = db.Column(db.String(64), db.ForeignKey('category.id'))
    courseName = db.Column(db.String(120), unique = True)
    ip = db.Column(db.SmallInteger, default = WR_IP_YES)
    duration = db.Column(db.Integer)
    productRev = db.Column(db.String(64))
    #use when database is updated?
    releaseDate = db.Column(db.DateTime)

    def __repr__(self):
        return '<Category> %r>' % (self.courseName)

backref が衝突しないように変更categoryした様子をご覧ください。category_id

于 2013-02-13T21:52:35.183 に答える