Как выполнить запись для записи в базу данных с отношением один ко многим? - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь сделать небольшой проект, но у меня есть некоторые трудности со структурой базы данных в SQLAlchemy. У меня есть две модели базы данных (код ниже).

  1. Модель пользователя создается и добавляется в базу данных при регистрации.
  2. Затем мне нужно найти способ добавить Клиентов для входа пользователя из его профиля.

Вопрос: Как мне это сделать? Мне нужно создать запись специально для вошедшего в систему пользователя. Чтобы при отображении их (его клиентов) они отображались только этому конкретному пользователю.

класс User (UserMixin, db.Model): tablename = 'user'

id = db.Column(db.Integer, primary_key=True)
company_name = db.Column(db.String(120), index=True, unique=False)
email = db.Column(db.String(120), index=True, unique=True)
password_hash = db.Column(db.String(128))
clients = db.relationship('Client', backref='invoice_clients', lazy='dynamic')

класс Client (db.Model): tablename = 'client'

id = db.Column(db.Integer, primary_key=True)
client_name = db.Column(db.String(140))
client_company = db.Column(db.String(140))
client_email = db.Column(db.String(140))
invoice_amount = db.Column(db.Integer)
service_description = db.Column(db.String)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

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

1 Ответ

0 голосов
/ 01 ноября 2019

Прежде всего, я считаю, что у вас есть параметр backref в обратном направлении. Это свойство, которое вы можете использовать для ссылочных объектов, чтобы «вернуться» к текущему классу. Так что, вероятно, это должно выглядеть так:

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

    clients = db.relationship('Client', backref='user', lazy='dynamic')

Что касается вашего вопроса о добавлении клиентов для конкретного пользователя, вы можете обратиться к нему двумя способами. Вы можете сделать это вручную:

# Or flask_login, or whatever you're using for user management
from flask_security import current_user

new_client = Client(client_name="Lancelot", user_id=current_user.id)
db.session.add(new_client)
db.session.commit()

Или вы можете просто использовать SQLAlchemy для добавления клиента к вашему пользователю. Объявленный внешний ключ приведет к тому, что идентификатор будет назначен автоматически:

from flask_security import current_user

new_client = Client(client_name="Sir Bedivere")
current_user.clients.append(new_client)
db.session.commit()
...