我正在尝试构建一个内部带有SQLAlchemy查询的User-class函数,该函数使我可以计算不同表上的User-record(基于其id)。为了避免使用多种函数编码,我尝试定义一个通用函数,在该函数中,我从Jinja2调用中接收db.modell类作为参数,例如:
{{ current_user.count('Customer') }}
或
{{ current_user.count('Player') }}
但是我最终遇到错误,因为Python无法将给定的class_name参数解释为真实的Class。他抱怨class_name没有功能ID。 当然,我可以为每个类指定特定的用户函数和特定的查询,但是我试图避免这些重复的编码。
关于如何处理此问题的任何想法?
class User(db.Model):
__tablename__='user'
id = Column(Integer, primary_key=True)
def count(self, class_name):
s = db.session()
count = s.query(class_name).filter(class_name.id == self.id).count()
return count
class Player(db.Model):
__tablename__='player'
id = Column(Integer, primary_key=True)
class Customer(db.Model):
__tablename__='Customer'
id = Column(Integer, primary_key=True)
预先感谢
迈克尔
答案 0 :(得分:1)
最好将类本身传递给这样的函数:
def count(self, class_):
s = db.session()
count = s.query(class_).filter(class_.id == self.id).count()
return count
但是如果由于某种原因必须传递类名,则可以执行以下操作:
def count(self, class_name):
class_ = {
'player':Player,
'customer':Customer,
}[class_name.lower()]
s = db.session()
count = s.query(class_).filter(class_.id == self.id).count()
return count
没有太大区别,但是您可以这样做。
还有另一种方法,但是我不建议这样做:
def count(self, class_name):
class_ = globals()[class_name]
s = db.session()
count = s.query(class_).filter(class_.id == self.id).count()
return count
如果一切都存在于global
范围内,这种方法将起作用。
了解有关globals
Here
请注意:
注意不要将
class
用作变量的名称,class
是预定义的。使用其他类似class_
如果以第二种方式传递了错误的类名,它将引发
key error
。您可以使用try
和except
来处理它。