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'

所以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)
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'`

您可以看到您已经创建了一种关系CategoryProduct其中有两种方式,因此您可以category.products列出与该类别关联的所有产品,或者您可以选择product.category为您提供所选产品的类别。

但是您已经categoryProduct. 所以只要把它改成唯一的——你的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以便 backref 不再与它发生冲突。

于 2013-02-13T21:52:35.183 回答