Считано от 1.3.17 вече не е необходимо заобиколно решение
Отговорът по-долу се озова в документите като ARRAY от ENUM . Тази страница с документи вече казва:
Стар отговор за исторически цели:
Разгледах Проблем 3467 публикувано от Wichert Akkerman и това заобиколно решение беше публикувано. Заслуга на Майк Байер. Декларирайте следния клас във вашия код (с необходимите импортирания, разбира се):
from sqlalchemy.dialects.postgresql import ARRAY
from sqlalchemy import cast
class ArrayOfEnum(ARRAY):
def bind_expression(self, bindvalue):
return cast(bindvalue, self)
def result_processor(self, dialect, coltype):
super_rp = super(ArrayOfEnum, self).result_processor(dialect, coltype)
def handle_raw_string(value):
if value==None:
return []
inner = re.match(r"^{(.*)}$", value).group(1)
return inner.split(",")
def process(value):
return super_rp(handle_raw_string(value))
return process
ArrayOfEnum
вече е специален тип колона, която се използва в дефиницията на модела.
Така че вместо
class Judge(db.Model):
statuses = db.Column(ARRAY(status))
Сега можете да направите:
class Judge(db.Model):
statuses = db.Column(ArrayOfEnum(status))
Сега във вашия код можете да присвоите стойности на statuses
със списък и ще направи правилното кастинг при запазване:
my_judge_object.status = ['unmoderated', 'nominee']