Как сделать два первичных ключа в двух разных таблицах уникальными, используя flask -sqlalchemy? - PullRequest
0 голосов
/ 07 февраля 2020

Итак, я работаю над форумоподобным веб-сайтом для дискуссий, используя python framework Flask. Я создал базу данных, используя SQLite. Я определил две таблицы (классы) и сделал первичные ключи для обеих. Однако первичные ключи, которые они производят, одинаковы. Например, для первого набора данных первичный ключ равен 1 для обоих, и я не могу различить эти два набора данных. Я могу получить доступ к данным первой таблицы, если мне нужно, но когда я пытаюсь получить данные второй таблицы, она снова возвращает мне данные первой таблицы. Есть ли способ иметь два уникальных первичных ключа для обоих или мне нужно настроить две разные базы данных.

from datetime import datetime
from flaskblog import db, login_manager
from flask_login import UserMixin


@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))


class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    image_file = db.Column(db.String(20), nullable=False, default='default.jpg')
    password = db.Column(db.String(60), nullable=False)
    posts = db.relationship('Post', backref='author', lazy=True)
    posts_addmath = db.relationship('PostAddmath', backref='author', lazy=True)

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


class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    content = db.Column(db.Text, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

    def __repr__(self):
        return f"Post('{self.title}', '{self.date_posted}')"


class PostAddmath(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    content = db.Column(db.Text, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

    def __repr__(self):
        return f"Post('{self.title}', '{self.date_posted}')"

Это таблицы в models.py.

id_addmath = db.Column(db.Integer, primary_key=True)

Я попытался изменить переменную 'id' в классе 'PostAddmath', но это не сработало.

@app.route("/post/<int:post_id>")
@login_required
def post_intmath(post_id):
    post = Post.query.get_or_404(post_id)
    return render_template('subjects/intmath/post_intmath.html', title=post.title, post=post)


@app.route("/post/<int:post_id>")
@login_required
def post_addmath(post_id):
    post = PostAddmath.query.get_or_404(post_id)
    return render_template('subjects/addmath/post_addmath.html', title=post.title, post=post)

Это способ доступа к данным в моих маршрутах. py.

Когда я пытаюсь получить доступ к данным с помощью 'post.id', он выдает мне только результаты первых таблиц, а не таблицы отправки.

Если мне нужно настроить другую базу данных, пожалуйста, дайте мне знать, как это сделать. Любая помощь очень ценится. Спасибо.

1 Ответ

1 голос
/ 07 февраля 2020

У вас один и тот же маршрут до post_intmath и post_addmath. Вы должны изменить маршруты, например, для первого маршрута оставить его таким, как он есть /post/<int:post_id>, а для второго маршрута изменить его, например, на /addpost/<int:post_id>.

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