добавить вычисляемое поле в схему eve

есть ли способ внести в схему собственное вычисляемое поле, которое можно заполнить значением, рассчитанным в событии before_output из фляги, или что-то в этом роде?

schema = {
    # Schema definition, based on Cerberus grammar. Check the Cerberus project
    # (https://github.com/nicolaiarocci/cerberus) for details.
    'firstname': {
        'type': 'string',
        'minlength': 1,
        'maxlength': 10,
    },
    'lastname': {
        'type': 'string',
        'minlength': 1,
        'maxlength': 15,
        'required': True,
        # talk about hard constraints! For the purpose of the demo
        # 'lastname' is an API entry-point, so we need it to be unique.
        'unique': True,
    },
    # 'role' is a list, and can only contain values from 'allowed'.
    'role': {
        'type': 'list',
        'allowed': ["author", "contributor", "copy"],
    },
    # An embedded 'strongly-typed' dictionary.
    'location': {
        'type': 'dict',
        'schema': {
            'address': {'type': 'string'},
            'city': {'type': 'string'}
        },
    },
    'born': {
        'type': 'datetime',
    },
    'calculated_field': {
        'type': 'string',
    }
}

и вычисляемое_поле заполняется с использованием собственного оператора запроса mongodb.


eve
person Harald Wiesinger    schedule 20.07.2016    source источник
comment
Разве вставка перед вставкой перехватчик событий не решает вашу проблему? Вы можете заполнить значение calculate_field перед вставкой и даже сделать его доступным только для чтения в схеме, чтобы избежать ручных вставок.   -  person gcw    schedule 20.07.2016


Ответы (1)


  1. Обновите настройки, чтобы ваше поле было помечено как доступное только для чтения: 'calculated_field': {'readonly': True}. Это предотвратит случайную запись клиентов в поле. Установка его как строкового типа, вероятно, не требуется;
  2. Добавьте функцию обратного вызова в сценарий запуска. Это обработает исходящие документы, введя рассчитанные значения в ваше поле только для чтения;
  3. Прикрепите свой обратный вызов к событию on_fetched приложения.
  4. Запустите приложение.

Таким образом, ваш сценарий может выглядеть примерно так:

from eve import Eve

# the callback function
def add_calculated_field_value(resource, response):                                          
    for doc in response['_items']:                                                    
        doc['calculated_field'] = 'hello I am a calculated field'

# instantiate the app and attach the callback function to the right event
app = Eve()
app.on_fetched_resource += add_calculated_field_value

if __name__ == '__main__':
    app.run()
person Nicola Iarocci    schedule 28.07.2016