2013-02-13 110 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