Картинка блога

Продолжаю работать с AppEngine. Столкнулся с мыслью, что использование целого числа для статуса не очень удобно. Я привык к C# и конструкции языка, типа Enum. По этому, решил найти нечто подобное для GAE. Идея в том, чтобы использовать следующий синтаксис:

status = validators.EnumProperty(choice=['not_moderated','moderated','blocked'])

Класс для поля перечеслиения выглядит так:

from google.appengine.ext import db

class EnumProperty(db.Property):
    """
    Maps a list of strings to be saved as int. The property is set or get using
    the string value, but it is stored using its index in the 'choices' list.
    """
    data_type = int

    def __init__(self, choices=None, **kwargs):
        if not isinstance(choices, list):
            raise TypeError('Choices must be a list.')
        super(EnumProperty, self).__init__(choices=choices, **kwargs)

    def get_value_for_datastore(self, model_instance):
        value = self.__get__(model_instance, model_instance.__class__)
        if value is not None:
            return int(self.choices.index(value))

    def make_value_from_datastore(self, value):
        if value is not None:
            return self.choices[int(value)]

    def empty(self, value):
        return value is None

Метки:,

Один комментарий в “AppEngine сохраняем перечисление в базу”

  1. Good work, keep us posting, you are good writer.