flask sqlalchemy,以列表形式检索PostgreSQL枚举值



我在使用flask-sqlalchemy时有一个最奇怪的行为,我有一个User模型,还有一个用户角色为userrole的枚举,它有以下值('vendor', 'vendor_admin', 'admin', 'collector', 'retailer'),奇怪的是,每当我查询用户时,由于某种原因,除了admin之外,我得到的所有角色都是字符串,它是值为adminlist

我已经删除了数据库,并从头开始重新迁移了所有内容,但仍然如此。

这是我的User型号:

from app import db, ma
from marshmallow_enum import EnumField
import enum
import bcrypt

class UserRoleEnum(enum.Enum):
admin = 'admin',
collector = 'collector'
retailer = 'retailer'
vendor = 'vendor'
vendor_admin = 'vendor_admin'

class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(), nullable=False)
mobile = db.Column(db.String(), nullable=False, unique=True)
username = db.Column(db.String(), unique=True, nullable=False)
password = db.Column(db.TEXT(), nullable=False)
is_active = db.Column(db.Boolean(), default=False)
role = db.Column(db.Enum(UserRoleEnum), nullable=False)
created_on = db.Column(db.DateTime, server_default=db.func.now())
updated_on = db.Column(db.DateTime, server_default=db.func.now(), server_onupdate=db.func.now())
# relations
#related fields
organization_id = db.Column(db.Integer, db.ForeignKey('organizations.id'), nullable=True)
invoices = db.relationship('Invoice', backref='user')
def __init__(
self,
name,
username,
mobile,
password,
role,
is_active,
organization_id = None
):
self.name = name
self.username = username
self.mobile = mobile
self.role = role
self.is_active = is_active
self.organization_id = organization_id
self.password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode()
def __repr__(self):
return "<id %s>" % self.id

class UserSchema(ma.SQLAlchemyAutoSchema):
role = EnumField(UserRoleEnum, by_value=True)
class Meta:
exclude = ['password']
model = User
load_instance = True

这是登录端点:

@auth_routes.route('login', methods=['POST'])
def login():
payload = request.json
if not payload.get('mobile') or not payload.get('password'):
return "Mobile and Password are required", 400
user = User.query.filter_by(mobile=payload.get('mobile')).first()
if not user:
return "User not found", 404
if bcrypt.checkpw(payload.get('password').encode('utf-8'), user.password.encode('utf-8')):
organization = None
if user.organization_id:
organization = OrganizationSchema().dump(Organization.query.get(user.organization_id)).data
token = create_access_token(identity={
'id': user.id,
'username': user.username,
'mobile': user.mobile,
'is_active': user.is_active,
'role': user.role.value,
'organization': organization
}, expires_delta=timedelta(days=0) + timedelta(days=365))
return {
"token": token
}
else:
return "Error on password"

以下是来自终端的示例:

>>> user = User.query.get(1)
>>> user.role.value
('admin',)
>>> user = User.query.get(2)
>>> user.role.value
'vendor_admin'

您有一个尾随逗号,因此admin值是一个元组

class UserRoleEnum(enum.Enum):
admin = 'admin',

删除它,一切都会好

最新更新