Эффективный способ переупорядочивания объектов в Django
Я написал запрос для переупорядочивания объектов на основе значений, полученных в запросе API. Ниже приведен пример кода, который я написал:
@action(detail=False, permission_classes=[], methods=["PUT"])
def reorder_modules(self, request, *args, **kwargs):
"""
ReOrdering Modules
Sample request data
{
<module_id>: <ordering_number>
12: 2,
13: 1,
14, 3,
}
"""
updatabale_modules = []
for module_id, module_order in request.data.get("modules", {}).items():
_mod = Module.objects.get(id=module_id)
_mod.order = module_order
updatabale_modules.append(_mod)
Module.objects.bulk_update(updatabale_modules, ["order"])
return Response({"detail": "successfully reordered course modules"}, status=HTTP_200_OK)
Есть ли способ избежать зацикливания и получения каждого модуля? Если это возможно, я смогу сэкономить на выполнении нескольких запросов.
Вместо прямого запроса Module.objects.get(id=module_id)
вы можете инстанцировать объект Module
, используя:
Module(id=model_id)
, так что перепишите свой метод так:
def reorder_modules(self, request, *args, **kwargs):
updatabale_modules = []
for module_id, module_order in request.data.get("modules", {}).items():
_mod = Module(id=module_id)
_mod.order = module_order
updatabale_modules.append(_mod)
Module.objects.bulk_update(updatabale_modules, ["order"])
return Response({"detail": "successfully reordered course modules"}, status=HTTP_200_OK)
Я отладил это представление с помощью инспектора запросов, и оно действительно производит только один запрос к базе данных, и он работает с несуществующими идентификаторами