9

Tôi đang sử dụng hướng dẫn này làm hướng dẫn. http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-databaseVấn đề cơ sở dữ liệu Flask

Tôi muốn có Danh mục có thể phát huy nhiều Sản phẩm. Tương tự như cách Người dùng có nhiều Bài đăng.

khi tôi mở ra dịch viên python và cố gắng tạo ra một thể loại

>>>from app import db, models 
>>>u = models.Category(name="Test") 

tôi nhận được lỗi này

/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' 

Vì vậy, có một vấn đề với backref. Trong hướng dẫn (và tôi đã thử nó với mã của anh ta), anh ta có thể tạo một User với cú pháp tương tự.

Tôi thậm chí đã thử sử dụng tất cả các tệp của mình và đã tạo và di chuyển cơ sở dữ liệu mới và tôi gặp lỗi tương tự.

Đây là tập tin models.py tôi:

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) 

Trả lời

14

Đó là vì bạn đã có một vụ va chạm. Lỗi này là:

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

Bạn có thể thấy rằng bạn đã tạo ra một mối quan hệ trong vòng Category-Product đó là hai chiều, vì vậy bạn có thể làm category.products để liệt kê tất cả các sản phẩm liên quan đến thể loại đó, hoặc cách khác bạn có thể đi product.category sẽ cung cấp cho bạn danh mục cho sản phẩm đã chọn.

Nhưng bạn đã có tài sản category trong Product. Vì vậy, chỉ cần thay đổi nó được unique-- lớp Product của bạn thường sẽ giống như thế:

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) 

Xem làm thế nào tôi đã thay đổi category để category_id để các backref không còn va chạm với nó.

+0

Cảm ơn bạn rất nhiều – Siecje

+0

Điều này có thực thi đổi tên danh mục trường cơ sở dữ liệu SQL thành category_id không? – Herbert

Các vấn đề liên quan