首页 > 解决方案 > Flask/SQLAlchemy - 创建具有一对多关系的模型时出错(一个或多个映射器无法初始化......)

问题描述

我试图在这两个表(“用户”和“行星”)之间建立一对多的关系,但出现此错误:

一个或多个映射器未能初始化 - 无法继续初始化其他映射器。触发映射器:'映射类用户->用户'。最初的例外是:无法确定关系 User.planet 上的父/子表之间的连接条件 - 没有链接这些表的外键。确保引用列与 ForeignKey 或 ForeignKeyConstraint 相关联,或指定“primaryjoin”表达式。

我已经看到了这个问题的答案,但没有一个有效,我不知道问题出在哪里?

我还想将 2 个模型分成 2 个不同的文件,在这种情况下如何工作?

非常感谢你的帮助。

from sqlalchemy import Column, Integer, String, FLOAT
from app import db, ma


# database models:
class User(db.Model):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    first_name = Column(String)
    last_name = Column(String)
    email = Column(String, unique=True)
    password = Column(String)

    planet = db.relationship('Planet', backref='users', lazy='dynamic')


class Planet(db.Model):
    __tablename__ = 'planets'
    planet_id = Column(Integer, primary_key=True)
    planet_name = Column(String)
    planet_type = Column(String)
    home_star = Column(String)
    mass = Column(FLOAT)
    radius = Column(FLOAT)
    distance = Column(FLOAT)

    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))


class UserSchema(ma.Schema):
    class Meta:
        fields = ('id', 'first_name', 'last_name', 'email', 'password')


class PlanetSchema(ma.Schema):
    class Meta:
        fields = ('planet_id', 'planet_name', 'planet_type', 'home_star', 'mass', 'radius', 'distance')

#__init__.py

from flask import Flask, jsonify, request
from flask_sqlalchemy import SQLAlchemy
import os
from flask_marshmallow import Marshmallow
from flask_jwt_extended import JWTManager, jwt_required, create_access_token
# from flask_cors import CORS, cross_origin

db = SQLAlchemy()
ma = Marshmallow()
jwt = JWTManager()


def create_app():
    app = Flask(__name__)
    basedir = os.path.abspath(os.path.dirname(__file__))
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'planets.db')
    app.config['JWT_SECRET_KEY']='super_secret'   
    # cors = CORS(app)
    # app.config['CORS_HEADERS'] = 'Content-Type'

    db.init_app(app)
    ma.init_app(app)
    jwt.init_app(app)
    # jwt = JWTManager(app)

    from views import planet, users
    app.register_blueprint(planet.main)
    app.register_blueprint(users.users)

    return app

标签: pythonflask-sqlalchemy

解决方案


推荐阅读