mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-17 19:52:25 +03:00
parent
77ef27f18f
commit
89c79d6649
|
@ -69,13 +69,14 @@ class UpdateModelMixin:
|
||||||
serializer.is_valid(raise_exception=True)
|
serializer.is_valid(raise_exception=True)
|
||||||
self.perform_update(serializer)
|
self.perform_update(serializer)
|
||||||
|
|
||||||
queryset = self.filter_queryset(self.get_queryset())
|
if hasattr(instance, '_prefetched_objects_cache'):
|
||||||
if queryset._prefetch_related_lookups:
|
|
||||||
# If 'prefetch_related' has been applied to a queryset, we need to
|
# If 'prefetch_related' has been applied to a queryset, we need to
|
||||||
# forcibly invalidate the prefetch cache on the instance,
|
# forcibly invalidate the prefetch cache on the instance
|
||||||
# and then re-prefetch related objects
|
|
||||||
instance._prefetched_objects_cache = {}
|
instance._prefetched_objects_cache = {}
|
||||||
prefetch_related_objects([instance], *queryset._prefetch_related_lookups)
|
queryset = self.filter_queryset(self.get_queryset())
|
||||||
|
if getattr(queryset, '_prefetch_related_lookups', None):
|
||||||
|
# And then re-prefetch related objects
|
||||||
|
prefetch_related_objects([instance], *queryset._prefetch_related_lookups)
|
||||||
|
|
||||||
return Response(serializer.data)
|
return Response(serializer.data)
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,13 @@ class UserUpdateWithoutPrefetchRelated(generics.UpdateAPIView):
|
||||||
serializer_class = UserSerializer
|
serializer_class = UserSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class UserRetrieveWithoutQuerySet(generics.RetrieveUpdateAPIView):
|
||||||
|
serializer_class = UserSerializer
|
||||||
|
|
||||||
|
def get_object(self):
|
||||||
|
return User.objects.get(pk=self.kwargs['pk'])
|
||||||
|
|
||||||
|
|
||||||
class TestPrefetchRelatedUpdates(TestCase):
|
class TestPrefetchRelatedUpdates(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.user = User.objects.create(username='tom', email='tom@example.com')
|
self.user = User.objects.create(username='tom', email='tom@example.com')
|
||||||
|
@ -90,3 +97,11 @@ class TestPrefetchRelatedUpdates(TestCase):
|
||||||
)
|
)
|
||||||
with self.assertNumQueries(16):
|
with self.assertNumQueries(16):
|
||||||
UserUpdateWithoutPrefetchRelated.as_view()(request, pk=self.user.pk)
|
UserUpdateWithoutPrefetchRelated.as_view()(request, pk=self.user.pk)
|
||||||
|
|
||||||
|
def test_can_update_without_queryset(self):
|
||||||
|
request = factory.patch('/', {'username': 'new'})
|
||||||
|
response = UserRetrieveWithoutQuerySet.as_view()(request, pk=self.user.pk)
|
||||||
|
assert response.data['id'] == self.user.id
|
||||||
|
assert response.data['username'] == 'new'
|
||||||
|
self.user.refresh_from_db()
|
||||||
|
assert self.user.username == 'new'
|
||||||
|
|
Loading…
Reference in New Issue
Block a user