【问题标题】:Get sqlAlchemy field name获取 sqlAlchemy 字段名称
【发布时间】:2021-08-24 08:54:38
【问题描述】:

我有这样的表的 sqlAlchemy 模型:

Base = declarative_base()
class User(Base):
__tablename__ = 'user'
uid = Column('id', Integer, primary_key=True)
name = Column('name', String(255), nullable=False)
surname = Column('surname', String(255), nullable=False)

我想创建方法“user_errors”,它将返回错误字段的字典

errors = {field_name : field_content}

但我不知道如何在代码中获取 field_name。

我想像这样使用它:

def user_errors(user):
    errors = {}
    if is_error(user.name):
        errors[user.name.__name__] = user.name
    ...
    return errors

【问题讨论】:

  • 您是否正在寻找一些适用于不同字段/列的“通用”实现?

标签: python python-3.x sqlalchemy orm


【解决方案1】:

你打算将它实现为 User 类的方法,不是吗?

如果是这样,下面的代码应该适合你:

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

def is_error(name):
    if name != "Guido Van Rossum":
        return True
    return False


Base = declarative_base()
class User(Base):
    __tablename__ = 'user'
    uid = Column('id', Integer, primary_key=True)
    name = Column('name', String(255), nullable=False)
    surname = Column('surname', String(255), nullable=False)
    
    def user_errors(self):
        errors = {}
        if is_error(self.name):
            errors["user_name"] = self.name
        # do some stuff 
        return errors

输出:

>>> user = User()
>>> user.name = 'test'
>>> user.user_errors()
 {'user_name': 'test'}

如果你想创建一个单独的函数,你的版本是正确的:

user = User()
user.name = 'test'

def user_errors(user):
   errors = {}
   if is_error(user.name):
        errors["user_name"] = user.name
        # do some stuff 
        return errors

user_errors(user)

Output:{'user_name': 'test'}

正如我所见,您不需要使用一些魔术参数来设置错误字典的键名,因为您已经定义了您正在检查用户名,无论如何,如果您想统一错误检查和迭代所有用户类参数,尝试像这样使用:

def user_errors(user):
    errors = {}
    for col_name in user.__table__.columns.keys():
        col_value = user.__getattribute__(col_name)
        if is_error(col_value):
            errors[col_name] = col_value
        # do some stuff 
    return errors

# to get this stuff working you should define ALL class attributes, otherwise - get exeption
user = User()
user.id = 1
user.name = 'test'
user.surname = 'test'

user_errors(user)
Output: {'id': 1, 'name': 'test', 'surname': 'test'}

希望对你有帮助

有用的链接: https://www.tutorialsteacher.com/python/magic-methods-in-python

【讨论】:

  • 顺便说一句,我想说类中的实现要好得多,因为您可以为不同的类创建特定的检查。
猜你喜欢
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多