SQLAlchemy a baňka vztahy

hlasů
1

UPDATE: Díky jednomu z připomínek, které jsem dostal blíž, jsem přidat tabulku sdružení:

association = db.Table('association',
    db.Column('user_id', db.Integer, db.ForeignKey('user.id'), primary_key=True),
    db.Column('restaraunt_id', db.Integer, db.ForeignKey('restaraunt.id'), primary_key=True)
)

Fungovalo to docela dobře, ve skořápce jsem byl schopen:

u=User(username='bob', email='bob@villa.com')
db.session.add(u)
db.session.commit()
r=Restaraunt(name='Five Guys', costRating=4)
db.session.add(r)
db.session.commit()
rp=RestarauntPreferences(user=u, restaraunt=r, rating=0)
db.session.add(rp)
db.session.commit()

Pak:

rp.restaraunt.name
['Five Guys']

ÚŽASNÝ. ALE ... The db.session.add (rp) přidá duplicitní záznamy do tabulky RestarauntPreferences? Něco s tím, jak jsem prohlásil asociaci? Něco jiného jsem nedostal o SQLAlchemy a nádoby? (A s použitím db prohlížeč se podívat na SQLite databáze, tabulka sdružení nemá žádné informace v něm obsažené, když jsem spustit příkazy shellu, není si jistý, jestli je to správně ... nebo ne?)

ORIG POST: (pod modely)

Snažil jsem se vytvořit tento malý baňky aplikaci, která používá SQLAlchemy. Modely jsem se snaží pracovat s a pracovní vztahy s mnoho-to-many. Jsou popsány níže s tím, jak chci, aby jejich použití.

(V podstatě uživatel může dát rating několika restauracích)

#how do I use these??

rprefs=RestarauntPreferences.query.filter_by(user=current_user) 
rprefs.restaraunt.name   #doesn't work, doesn't know what restaraunt is

#models below

class User(UserMixin, db.Model):
    __tablename__ = 'user'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    password_hash = db.Column(db.String(128))
    recipient_idf= db.Column(db.String(256))
    first_name = db.Column(db.String(128))
    last_name = db.Column(db.String(128))
    most_recent_lunch_date = db.Column(db.DateTime)
    lunch_Rating = db.Column(db.Integer)
    phone_number = db.Column(db.String(128))

    def set_password(self, password):
        self.password_hash = generate_password_hash(password)

    def check_password(self, password):
        return check_password_hash(self.password_hash, password)

    def __repr__(self):
        return '<User {} {}>'.format(self.username, self.recipient_idf)


class Restaraunt(db.Model):
    __tablename__ = 'restaraunt'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(128))
    costRating = db.Column(db.Integer)

    def __repr__(self):
        return '<Restaraunt {} {}>'.format(self.name, self.costRating)


class RestarauntPreferences(db.Model):
    __tablename__ = 'restaraunt_preferences'
    id = db.Column(db.Integer, primary_key=True)

    restaraunt_id = db.Column(db.Integer, db.ForeignKey('restaraunt.id'))
    restaraunt = relationship(Restaraunt, foreign_keys=[restaraunt_id])

    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    user = relationship(User, foreign_keys=[user_id])

    rating = db.Column(db.Integer)


    def __repr__(self):
        return '<RestarauntPref {} {} {}>'.format(self.restaraunt_id, self.user_id, self.rating)
Položena 07/11/2018 v 23:56
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

Obojí, Flask-Sqlalchemy a Sqlalchemy , dokumentace uvádí, že sdružení tabulka nutná pro mnoho-to-many vztah k práci. Zkuste vytvořit ho jako v příkladech a přidat do svého prohlášení jako secondaryparam.

Odpovězeno 08/11/2018 v 08:15
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more