Я пытаюсь предотвратить вставку дубликатов документов следующим образом:
- Получите список всех документов из нужной конечной точки, который будет содержать все документы в формате JSON. Этот список называется
available_docs
. - Используйте хук
pre_POST_<endpoint>
для обработки запроса перед вставкой в данные. Я не использую хукon_insert
, так как мне нужно сделать это перед проверкой. - Поскольку мы можем получить доступ к объекту
request
, используйтеrequest.json
для получения полезной нагрузки в формате JSON. - Проверьте, содержится ли уже
request.json
вavailable_docs
- Вставьте новый документ, если это не только дубликат, в противном случае прервите.
Используя этот подход, я получил следующий фрагмент:
def check_duplicate(request):
if not request.json in available_sims:
print('Not a duplicate')
else:
print('Duplicate')
flask.abort(422, description='Document is a duplicate and already in database.')
Список available_docs
выглядит так:
available_docs = [{'foo': ObjectId('565e12c58b724d7884cd02bb'), 'bar': [ObjectId('565e12c58b724d7884cd02b9'), ObjectId('565e12c58b724d7884cd02ba')]}]
Полезная нагрузка request.json
выглядит так:
{'foo': '565e12c58b724d7884cd02bb', 'bar': ['565e12c58b724d7884cd02b9', '565e12c58b724d7884cd02ba']}
Как видите, единственная разница между документом, который был передан в API, и документом, уже хранящимся в БД, заключается в типе данных идентификаторов. В связи с этим оператор if
в приведенном выше фрагменте оценивается как True
и считает, что вставляемый документ не является дубликатом, тогда как он определенно является дубликатом.
Есть ли способ проверить, есть ли уже переданный документ в базе данных? Я не могу использовать уникальные поля, т.к. комбинация всех полей документа должна быть уникальной. Есть уникальный идентификатор (который я пропустил в этом примере), но он не подходит для желаемого сравнения, так как это своего рода отметка времени.
Я думаю, что что-то вроде приведения данных идентификаторов к ключам foo
и bar
как ObjectIDs
поможет, но я не знаю, как это сделать, так как я не знаю, откуда взять тип данных ObjectID
.
if not request.json in available_sims
- person Nir Alfasi   schedule 13.12.2015a = {'albert': 2015} l = [] l.append(a) b = {'albert': 2015} print(b in l)
оценивается какTrue
. Так что этот подход пришел мне в голову. - person albert   schedule 13.12.2015