2013-02-13 103 views
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) 

回答

14

这是因为你有一个碰撞。错误是:

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

你可以看到你已经创建内Category关系到Product这是双向的,所以你可以做category.products列出所有与该类别相关的产品,或者你可以去product.category这会给你所选产品的分类。

但您已在Productcategory财产。因此,只要改变它是unique--您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) 

见我是如何改变categorycategory_id使得backref不再与它发生碰撞。

+0

非常感谢你 – Siecje 2013-02-14 14:09:33

+0

这是否强制将SQL数据库字段类别重命名为category_id? – Herbert 2014-04-14 13:16:21