Mongoengine, как сбросить SequenceField после нового года? - PullRequest
0 голосов
/ 06 июня 2018

В моих моделях у меня есть один номер EmbeddedDocument, у которого есть поле последовательности (это не первичный ключ), это поле используется как объединенная строка для создания заголовка статьи (таким образом, поле действительно должно быть последовательным, так какбизнес-правило).

Правило таково: когда начинается год, порядковый номер должен перезапустить счет и начать отсчет с 1.

Пример:

...
12/30/2018 -> sequential_value = 545
12/30/2018 -> sequential_value = 546
12/31/2018 -> sequential_value = 547
01/01/2019 -> sequential_value = 1
01/01/2019 -> sequential_value = 2
...

Моя модель: class Number(EmbeddedDocument): sequential_value = SequenceField(required=True)

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

1 Ответ

0 голосов
/ 15 июня 2018

Я решаю проблему, меняя подход.Рассматривая, как mongoengine обрабатывает SequenceField :

fields.py

counter = collection.find_and_modify(query={'_id': sequence_id},
                                         update={'$inc': {'next': 1}},
                                         new=True,
                                         upsert=True)

Используя тот же подход, я создал функцию, которая делает то же самое, но использует2 идентификатора и год в качестве идентификатора запроса:

next_number = collection.find_and_modify(
    query={'_id': oid+'_'+oeid+'_'+str(year)}, 
           update={'$inc': {'next': 1}},
           new=True,
           upsert=True)

Итак ... каждый раз, когда создается объект, я использую эту функцию для генерации следующего порядкового номера и когда год меняет новую строкусоздается, поэтому порядковый номер снова начинается с 1.

...