Flask数据库问题

9 投票
1 回答
3346 浏览
提问于 2025-04-17 15:47

我正在使用这个教程作为参考。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'

所以问题出在backref上。在教程中(我也试过他的代码),他能用类似的语法创建一个用户。

我甚至尝试使用他所有的文件,并创建和迁移了一个新的数据库,但还是遇到同样的错误。

这是我的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)

1 个回答

13

这是因为你遇到了冲突。错误信息是:

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

你可以看到,在 CategoryProduct 之间建立了一个双向关系,这样你可以通过 category.products 来列出所有与该类别相关的产品,或者你也可以通过 product.category 来获取所选产品的类别。

但是在 Product 中你已经有了一个 category 属性。所以你只需要把它改成唯一的——你的 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)

你看,我把 category 改成了 category_id,这样就不会和之前的冲突了。

撰写回答