предоставить Enum во время создания БД - PullRequest
2 голосов
/ 25 октября 2019

Допустим, у меня есть общая модель Food sqlalchemy, которую я хочу использовать для разных приложений. В каждом приложении у меня есть перечисление FoodType, которое содержит различные типы продуктов, которые я буду использовать.

Я хочу иметь возможность передать этот Enum для моего приложения в мою общую модель. Есть идеи о том, как это сделать?

Вот моя модель питания:

class Food(Base):
    type = Column(Enum(FoodType, name="l=food_type"))

Я попытался определить пустое перечисление в моей общей модели, чтобы оно могло быть перезаписано в каждом приложении, ноэто, очевидно, не работает, он падает на:

sqlalchemy.exc.StatementError: (builtins.LookupError) "PIZZA" is not among the defined enum values

1 Ответ

1 голос
/ 25 октября 2019

Сделайте Food a 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)

... Или заставить фабрику возвращать миксин и наследовать от него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...