我使用本教程作为指导。 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)
答案 0 :(得分: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
,它会为你提供所选产品的类别。
但您已在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)
了解我如何将category
更改为category_id
,以便backref不再与其发生碰撞。