таблица сопоставления запросов flask-sqlalchemy, имеющая дополнительные столбцы - PullRequest
0 голосов
/ 08 февраля 2019

Я создал отношение многие ко многим согласно приведенному ниже коду, но я добавил дополнительные столбцы в таблицу сопоставлений.Я хочу получить эти столбцы по конкретному идентификатору пользователя.Может кто-нибудь посоветовать, как можно это сделать?Я прочитал много постов, но ни в одном из них нет дополнительных столбцов.

Если я делаю:

u = Users.query.filter_by(id='8').first()
u.subscriptions[0].id

Я вижу данные из таблицы подписки, но если я делаю:

u.subscriptions[0].subscription_id
OR
u.subscriptions[0].User_Subscription

Я получаю объект "Подписка" не имеетатрибут, так как я пытаюсь получить данные столбцов в таблице связей User_Subscription.

User_Subscription = db.Table('user_subscription', 
    db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
    db.Column('subscription_id', db.Integer, db.ForeignKey('subscription.id')),
    db.Column('stripe_subscription_id', db.String(100), nullable=True),
    db.Column('paypal_subscription_id', db.String(100), nullable=True)
)

class Subscription(db.Model):
    __tablename__ = "subscription"
    id = db.Column(db.Integer, primary_key=True)
    subscription_name = db.Column(db.String(100), unique=True, nullable=False)
    subscription_desc = db.Column(db.String(100), unique=False, nullable=False)
    date_created = db.Column(db.DateTime, default=datetime.datetime.utcnow)
    date_updated = db.Column(db.DateTime, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow)
    subscriptions = db.relationship('Users', secondary=User_Subscription, backref= db.backref('subscriptions', lazy='dynamic'))

class Users(db.Model, UserMixin):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    firstname = db.Column(db.String(50), unique=False, nullable=False)
    lastname = db.Column(db.String(50), unique=False, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password = db.Column(db.String(60), nullable=False)
    date_created = db.Column(db.DateTime, default=datetime.datetime.utcnow)
    date_updated = db.Column(db.DateTime, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow)
    user_status_id = db.Column(db.String(2), db.ForeignKey('user_status.id'))

1 Ответ

0 голосов
/ 18 апреля 2019

Вы получили сообщение об ошибке (объект «Подписка» не имеет атрибута), потому что это объект отношения, а не таблица.

В этой строке кода:

u.subscriptions[0].User_Subscription

youпытаемся получить доступ к атрибуту объекта User_Subcription, который является объектом отношения.

Если вы хотите создать новую таблицу ассоциации, создайте такую ​​же таблицу в вашей базе данных и определите еще один класс UserSubscription:

class UserSubscription(db.Model)
    __tablename__ = 'user_subscription'
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    subscription_id = db.Column(db.Integer, db.ForeignKey('subscription.id'))
    stripe_subscription_id = db.Column(db.String(100), nullable=True)
    paypal_subscription_id = db.Column(db.String(100), nullable=True)

    user = db.relationship('Users', backref='user_subscription')

И тогда вы можете получить доступ к атрибуту класса UserSubscription:

u.user_subscription.subscription_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...