9

Ich verwende dieses Tutorial als Richtlinie. http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-databaseFlask Database Ausgabe

Ich möchte Kategorien haben, die mehrere Produkte heben können. Ähnlich wie er einen User mit mehreren Posts hat.

, wenn ich die Python-Interpreter öffnen und versuchen, eine Kategorie

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

ich diesen Fehler zu erstellen

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

So gibt es ein Problem mit dem backref ist. Im Tutorial (und ich habe es mit seinem Code versucht) ist er in der Lage, einen Benutzer mit ähnlicher Syntax zu erstellen.

Ich habe sogar versucht, alle seine Dateien und erstellt und migrierte eine neue Datenbank und ich bekomme den gleichen Fehler.

Hier ist meine models.py Datei:

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) 

Antwort

14

Es ist, weil Sie eine Kollision haben. Der Fehler ist:

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

Sie sehen, dass Sie eine Beziehung innerhalb Category-Product erstellt haben, die zwei Art und Weise, so dass Sie category.products tun konnten alle Produkte mit dieser Kategorie zugeordnet aufzulisten, oder alternativ könnten Sie gehen product.category, die Ihnen die Kategorie für das ausgewählte Produkt geben würde.

Aber Sie haben bereits eine category Eigenschaft in Product. So einfach ändern unique-- Ihre Product Klasse sein im Allgemeinen soll wie folgt aussehen:

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) 

Sehen Sie, wie ich category zu category_id, so dass der backref nicht mehr kollidiert mit ihm geändert haben.

+0

Vielen Dank – Siecje

+0

Erzwingt dies die Umbenennung der Feldkategorie der SQL-Datenbank in category_id? – Herbert