После ~ 10 часов, стуча головой об эту стену, я решил, что в правильном направлении может отойти на заднее сиденье, и я обойдусь с хакерским способом, который работает. Я добавил следующий gnarlfest в свой просмотр.
@action(methods=['patch'], detail=False)
def bulk_update(self, request):
data = { # we need to separate out the id from the data
i['id']: {k: v for k, v in i.items() if k != 'id'}
for i in request.data
}
for inst in self.get_queryset().filter(id__in=data.keys()):
serializer = self.get_serializer(inst, data=data[inst.id], partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response({})
Если я внесу исправление в список [{id: 123, otherfield: "abc"}, ...]
, это будет частичное обновление. Я вполне уверен, что это делает n + 1 запросов и что это было бы намного более эффективно в сыром ORM ... но сейчас, это бесконечно лучше, чем n запросов . Кроме того, если идентификатор отсутствует в наборе запросов, он будет передаваться вместо ошибок. Это работает для меня, но не для других.
Я назначу щедрость на этот вопрос через 48 часов, чтобы соблазнить хороших ответов.