Sqlalchemy - один ко многим пользователям - PullRequest
0 голосов
/ 22 декабря 2018

надеюсь, все хорошо.У меня возникают трудности при попытке выяснить, как написать эту функциональность БД с помощью flask и SQLALCHEMY.

Я хочу иметь возможность зарегистрировать пользователя на сайте, который уже будет существовать в базе данных.

При их регистрации я хочу, чтобы маршрут мог назначать этого пользователя для модели сайта в БД. Причина, по которой я хочу это сделать, заключается в том, что я могу позже отправить сообщение всем пользователям, подключенным к определенному сайту, или сообщение всем пользователям для всех сайтов.

Этомои модели пользователей и сайтов в настоящее время :

class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
site = db.Column(db.String())
username = db.Column(db.String(20), unique=True, nullable=False)
email = db.Column(db.String(100), unique=True, nullable=False)
password = db.Column(db.String(60), nullable=False)
adminstatus = db.Column(db.Boolean)
user_data = db.relationship('Rma', backref='userdata', lazy=True)
# sites = db.relationship('Sites', secondary=usertosite, backref=db.backref('sites', lazy='dynamic'))

def __repr__(self):
    return f"User('{self.username}, '{self.email}')"

class Sites(db.Model):
id = db.Column(db.Integer, primary_key=True)
sitename = db.Column(db.String(), nullable=False)
contractstart = db.Column(db.String(), nullable=False)
contractend = db.Column(db.String(), nullable = False)
hwkey = db.Column(db.String(), nullable=False)
stations = db.Column(db.String(), nullable=False)
printers = db.Column(db.String(), nullable = False)
remprinters = db.Column(db.String(), nullable = False)
bof = db.Column(db.Boolean())
processor = db.Column(db.String(), nullable = False)
giftopt = db.Column(db.String(), nullable = False)

Вот моя регистрационная форма

# REGISTER NEW USER
@app.route('/register', methods=['POST', 'GET'])
@login_required
def register():
    form = RegistrationForm()
    if form.validate_on_submit():
        hashed_pw = bcrypt.generate_password_hash(form.password.data).decode('utf-8')
        user = User(site = form.site.data, username = form.username.data, email = form.email.data, password = hashed_pw, adminstatus= form.admin_status.data)
        db.create_all()
        db.session.add(user)
        db.session.commit()
        flash(f"{form.username.data} has been added!")
        return redirect(url_for('dash'))

    return render_template('register.html', name = 'login', form=form)

Я не уверен, как я могу это сделать, учитываяобычно, когда я добавляю форму в базу данных, я добавляю все элементы формы в конкретную модель.Если я попытаюсь установить отношение один ко многим, мне придется назначить модель Сайтов со всеми ее элементами вместе с конкретным пользователем, который не является идеальным, поскольку сайт уже будет создан в БД.Я супер нуб и, возможно, я пропускаю некоторые шаги, но, пожалуйста, помогите, если это возможно.Спасибо, ребята.

1 Ответ

0 голосов
/ 22 декабря 2018

Вам необходимо использовать внешний ключ.

class User(db.Model, UserMixin):
    ...
    site = db.Column(db.Integer, db.ForeignKey('sites.id'))

Затем, когда вы вводите информацию User в базу данных, вы предоставляете идентификатор первичного ключа сайта, который существует как Sites.Вы можете сделать это на своем маршруте или предоставить функцию переопределения инициализации, которая делает это на основе ключевого слова, например:

class User(..):
    ...
    def __init__(self, **kwargs):
        if 'site' in kwargs:
             site_id = db.session.query(Sites).filter(Sites.sitename == kwargs['site']).one().id
             kwargs['site'] = site_id
        super().__init__(**kwargs)

Обратите внимание, что я не думаю, что mySQL или SQLite по умолчанию обеспечивают согласованность внешнего ключаЛично я считаю раздражающим, что вы можете получить NULL-записи в базе данных yoru, когда вы можете их не ожидать, однако POSTGRES действительно обеспечивает это, я полагаю.Однако в sqlalchemy можно сделать несколько вещей, чтобы обеспечить согласованность внешних ключей в mySQL и SQLlite.

...