Kev
Kev

Reputation: 577

SQLAlchemy relationship error

I do have these 2 calsses als DB models trying to buidl a 1 to many relation:

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(255), index=True) #, unique=True)
    firstname = db.Column(db.String(50))
    lastname = db.Column(db.String(50))

    bt_ids = db.relationship("BT", order_by="BT.id", backref="user")



class BT(db.Model):
    __tablename__ = 'bt'
    id = db.Column(db.Integer, primary_key=True)
    bt_id = db.Column(db.String(255), unique=True)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))

    user = db.relationship("User", backref=db.backref('bt', order_by=id))

But I guess I do not really understand the way of setting up the relationships:

ArgumentError: Error creating backref 'user' on relationship 'User.bt_ids': property of that name exists on mapper 'Mapper|BT|bt'

Any ideas?

EDIT

I actually wanted to achive something like the example of SQLAlchemy

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
    name = Column(String(50))
    fullname = Column(String(50))
    password = Column(String(12))
    
    **addresses = relationship("Address", order_by="Address.id", backref="user")**

    def __repr__(self):
        return "<User(name='%s', fullname='%s', password='%s')>" % (
                                self.name, self.fullname, self.password)


                                
class Address(Base):
     __tablename__ = 'addresses'
     id = Column(Integer, primary_key=True)
     email_address = Column(String, nullable=False)
     user_id = Column(Integer, ForeignKey('users.id'))

     **user = relationship("User", backref=backref('addresses', order_by=id))**

     def __repr__(self):
         return "<Address(email_address='%s')>" % self.email_address

Upvotes: 0

Views: 1583

Answers (2)

Kev
Kev

Reputation: 577

Now I got it...

This was wrong:

user = db.relationship("User", backref=db.backref('bt_ids', order_by=id))

Now it works!

Upvotes: 0

Ozgur Vatansever
Ozgur Vatansever

Reputation: 52093

There is already a FK relation between User and BT through user_id property so you can't create another relation named user in BT.

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(255), index=True) #, unique=True)
    firstname = db.Column(db.String(50))
    lastname = db.Column(db.String(50))
    bts = db.relationship("BT", order_by="BT.id", backref="user")

class BT(db.Model):
    __tablename__ = 'bt'
    id = db.Column(db.Integer, primary_key=True)
    bt_id = db.Column(db.String(255), unique=True)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))

Upvotes: 1

Related Questions