【问题标题】:Flask-SQLAlchemy One to Many relationship failed to locate a nameFlask-SQLAlchemy 一对多关系找不到名称
【发布时间】:2017-12-12 02:53:09
【问题描述】:

我有一个带有 Flask-SQLAlchemy 的 Flask 应用程序。我正在尝试建立从用户到旅行的一对多关系。我看到了,如果我使用 SQLAlchemy 的 declarative_base 它可以工作,但是当我使用 Flask-SQLAlchemy 的 db.Model 时它不起作用。

我收到以下错误:

sqlalchemy.exc.InvalidRequestError: When initializing mapper Mapper|User|User, expression 'Trip' failed to locate a name ("name 'Trip' is not defined"). If this is a class name, consider adding this relationship() to the <class 'models.user.User'> class after both dependent classes have been defined.

以下是模型:

数据库.py

from flask import abort 
from flask_sqlalchemy import SQLAlchemy 
from sqlalchemy import exc

db = SQLAlchemy()


class Mixin(db.Model):
    __abstract__ = True
    id = db.Column(db.Integer, primary_key=True)
    date = db.Column(db.DateTime, default=db.func.now())
    date_changed = db.Column(
        db.DateTime, nullable=True, onupdate=db.func.now())
    date_to = db.Column(db.DateTime, nullable=True)

user.py

from database import Mixin, db

class User(Mixin, db.Model):
    __tablename__ = 'User'        
    trips = db.relationship(
        'Trip',
        backref=db.backref('user', lazy='joined'),
        lazy='dynamic'
    )     

trip.py

from database import Mixin, db

class Trip(Mixin, db.Model):
    __tablename__ = 'Trip'
    title = db.Column(db.String(100), nullable=False)
    description = db.Column(db.String(250), nullable=False)        
    user_id = db.Column(
        db.Integer,
        db.ForeignKey('User.id'),
        nullable=False
    )       

【问题讨论】:

  • 您可能根本没有导入trip 模块,或者您没有在正确的时间导入。
  • 但是如果我使用 SQLAlchemy 中的 declarative_base 为什么它会起作用?
  • 我不知道,您必须发布其余代码。

标签: python flask sqlalchemy flask-sqlalchemy


【解决方案1】:

我通过为我的模型使用一个文件来修复它。反正我没有足够的模型需要多个模型文件。

【讨论】:

  • 说您必须有足够的模型来将它们存储在自己的文件中,这是一个糟糕的想法。这叫做干净的代码结构,与模型的数量无关。
【解决方案2】:

将所有模型存储在一个文件中是个好主意,但仅适用于少数模型。对于大型的,我更愿意将模型存储在语义上独立的文件中。

models
├── __init__.py
├── model1.py
├── model2.py
└── model3.py

在__init__.py需要导入所有模型文件

import models.model1.py
import models.model2.py
import models.model3.py

【讨论】:

  • 这为我解决了这个问题。如果您能详细说明并说明为什么可以解决问题,我将不胜感激
  • 你也可以使用import models.model1(没有.py扩展名)。这适用于我的机器 Python 3.9。
猜你喜欢
  • 2016-06-15
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 2015-01-31
  • 1970-01-01
相关资源
最近更新 更多