|
1 | 1 | from django.core.exceptions import ObjectDoesNotExist |
2 | | -from django.db import transaction |
| 2 | +from django.db import router, transaction |
3 | 3 | from django.http import Http404 |
4 | 4 | from rest_framework import status |
5 | 5 | from rest_framework.response import Response |
@@ -56,22 +56,22 @@ class SequentialBulkCreatesMixin: |
56 | 56 | which depends on the evaluation of existing objects (such as checking for free space within a rack) functions |
57 | 57 | appropriately. |
58 | 58 | """ |
59 | | - @transaction.atomic |
60 | 59 | def create(self, request, *args, **kwargs): |
61 | | - if not isinstance(request.data, list): |
62 | | - # Creating a single object |
63 | | - return super().create(request, *args, **kwargs) |
64 | | - |
65 | | - return_data = [] |
66 | | - for data in request.data: |
67 | | - serializer = self.get_serializer(data=data) |
68 | | - serializer.is_valid(raise_exception=True) |
69 | | - self.perform_create(serializer) |
70 | | - return_data.append(serializer.data) |
| 60 | + with transaction.atomic(using=router.db_for_write(self.queryset.model)): |
| 61 | + if not isinstance(request.data, list): |
| 62 | + # Creating a single object |
| 63 | + return super().create(request, *args, **kwargs) |
| 64 | + |
| 65 | + return_data = [] |
| 66 | + for data in request.data: |
| 67 | + serializer = self.get_serializer(data=data) |
| 68 | + serializer.is_valid(raise_exception=True) |
| 69 | + self.perform_create(serializer) |
| 70 | + return_data.append(serializer.data) |
71 | 71 |
|
72 | | - headers = self.get_success_headers(serializer.data) |
| 72 | + headers = self.get_success_headers(serializer.data) |
73 | 73 |
|
74 | | - return Response(return_data, status=status.HTTP_201_CREATED, headers=headers) |
| 74 | + return Response(return_data, status=status.HTTP_201_CREATED, headers=headers) |
75 | 75 |
|
76 | 76 |
|
77 | 77 | class BulkUpdateModelMixin: |
@@ -113,7 +113,7 @@ def bulk_update(self, request, *args, **kwargs): |
113 | 113 | return Response(data, status=status.HTTP_200_OK) |
114 | 114 |
|
115 | 115 | def perform_bulk_update(self, objects, update_data, partial): |
116 | | - with transaction.atomic(): |
| 116 | + with transaction.atomic(using=router.db_for_write(self.queryset.model)): |
117 | 117 | data_list = [] |
118 | 118 | for obj in objects: |
119 | 119 | data = update_data.get(obj.id) |
@@ -157,7 +157,7 @@ def bulk_destroy(self, request, *args, **kwargs): |
157 | 157 | return Response(status=status.HTTP_204_NO_CONTENT) |
158 | 158 |
|
159 | 159 | def perform_bulk_destroy(self, objects): |
160 | | - with transaction.atomic(): |
| 160 | + with transaction.atomic(using=router.db_for_write(self.queryset.model)): |
161 | 161 | for obj in objects: |
162 | 162 | if hasattr(obj, 'snapshot'): |
163 | 163 | obj.snapshot() |
|
0 commit comments