比方说,我有一个通用的Food
sqlalchemy模型,我想将其重用于不同的应用程序。
在每个应用程序中,我都有一个FoodType
枚举,其中包含我将要使用的不同类型的食物。
我希望能够将此特定于应用的枚举传递给我的通用模型。关于如何做到这一点的任何想法?
这是我的食物模型:
class Food(Base):
type = Column(Enum(FoodType, name="l=food_type"))
我试图在通用模型中定义一个空的枚举,以便可以在每个应用程序中将其覆盖,但是显然不起作用,它会崩溃:
sqlalchemy.exc.StatementError: (builtins.LookupError) "PIZZA" is not among the defined enum values
答案 0 :(得分:1)
将Food
设为mixin而非具体模型,然后使用declared_attr
定义type
:
class FoodMixin:
@declared_attr
def type(cls):
return Column(Enum(cls.food_type, name="food_type"))
然后在您的应用程序中创建具体模型,如下所示:
class Food(FoodMixin, Base):
food_type = FoodType
另一种方法是为Food
定义一个模型工厂,该工厂将枚举类型作为参数并生成一个模型:
def food_maker(FoodType, Base):
class Food(Base):
type = Column(Enum(FoodType, name="food_type"))
return Food
以及在应用中:
Food = food_maker(FoodType, Base)
...或者让工厂返回一个mixin并从中继承。