Kể từ ngày 1.3.17, không cần giải pháp thay thế nữa
Câu trả lời dưới đây đã có trong tài liệu là ARRAY của ENUM . Trang tài liệu này hiện cho biết:
Câu trả lời cũ cho mục đích lịch sử:
Tôi đã xem Sự cố 3467 được đăng bởi Wichert Akkerman, và công việc xung quanh này đã được đăng. Tín dụng cho Mike Bayer. Khai báo lớp sau trong mã của bạn (tất nhiên với các nhập cần thiết):
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
hiện là một loại cột đặc biệt được sử dụng trong định nghĩa mô hình.
Vì vậy, thay vì
class Judge(db.Model):
statuses = db.Column(ARRAY(status))
Bây giờ bạn có thể làm:
class Judge(db.Model):
statuses = db.Column(ArrayOfEnum(status))
Bây giờ trong mã của bạn, bạn có thể gán giá trị cho các trạng thái statuses
với một danh sách và nó sẽ thực hiện truyền thích hợp khi lưu:
my_judge_object.status = ['unmoderated', 'nominee']