如何引用尚未定义的类?

5 投票
1 回答
1684 浏览
提问于 2025-04-18 17:00

我有以下两个类:

class Product(db.Model):
    __tablename__ = 'product'

    ProductID = db.Column(db.Integer, primary_key=True)
    StartOperatorID = db.Column(db.Integer, db.ForeignKey('user.UserID'), nullable=False)
    StartOperator = db.relationship("User", foreign_keys=[StartOperatorID])
    WorkBenchID = db.Column(db.Integer, db.ForeignKey('workbench.WorkBenchID'))
    WorkBench = db.relationship(WorkBench)


class WorkBench(db.Model):
    __tablename__ = 'workbench'

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

但是,我遇到了一个NameError错误,因为WorkBench这个类是在Product这个类下面定义的:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-1-3a482de7fdcf> in <module>()
----> 1 from example import models

/home/Sin5k4/example/models.py in <module>()
     16 
---> 17 class Product(db.Model):
     18     ProductID = db.Column(db.Integer, primary_key=True)

/home/Sin5k4/example/models.py in Product()
     21     WorkBenchID = db.Column(db.Integer, db.ForeignKey('workbench.WorkBenchID'))
---> 22     WorkBench = db.relationship(WorkBench)
     23 

NameError: name 'WorkBench' is not defined

我之前是做.NET的,现在在这方面真的很挣扎。那我该如何正确地定义这个类之间的关系呢?

1 个回答

6

当一个Python程序被解释执行时,类的定义会按照顺序执行,包括类级别变量的定义(比如关系)。为了允许关系的定义不按照顺序进行,SQLAlchemy提供了一些其他的用法,而不仅仅是直接传递类本身。实际上,你的一些其他关系已经在使用这种方式:传递字符串名称而不是类对象。你也可以传递一个lambda表达式,它会计算出类对象,这两种方法都能解决这个问题。

# by class name (preferred in most cases)
WorkBench = db.relationship('WorkBench')
# or by lambda
WorkBench = db.relationship(lambda: WorkBench)

撰写回答