Как передать имя класса в функцию для использования в Sqlalchemy Query - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь построить функцию класса пользователя с запросом SQLAlchemy, который позволяет мне подсчитывать записи пользователя в разных таблицах (на основе его идентификатора). Чтобы избежать множественного кодирования функций, я попытался определить универсальную функцию, где я получаю класс db.modell в качестве параметра от вызова Jinja2, например:

{{ current_user.count('Customer') }}

или

{{ current_user.count('Player') }}

Но я в итоге ошибаюсь, что Python не интерпретирует данный параметр class_name как реальный класс. Он жалуется, что class_name не имеет идентификатора функции. Конечно, я мог бы указать конкретные пользовательские функции с определенным запросом для каждого класса, но я старался избегать этих дублирующих кодировок.

Есть идеи, как с этим бороться?

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)

Заранее спасибо

Michael

1 Ответ

0 голосов
/ 10 ноября 2018

Лучше передать сам класс функции следующим образом:

 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 Здесь

обратите внимание, что:

  1. Осторожно, не используйте class в качестве имени переменной, class предопределено. используйте что-то еще, например class_

  2. Это повысит key error, если вы передадите неправильное имя класса другим способом. Вы можете справиться с этим с try и except.

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