Updated the README and the mixing to provide better asserts.
All checks were successful
StarFields Django Rest Framework Generics / build (push) Successful in 36s

This commit is contained in:
2025-01-19 07:19:02 +02:00
parent edf3dc051d
commit 45a1af3c52
3 changed files with 59 additions and 16 deletions

View File

@@ -123,8 +123,24 @@ class CachedListCreateModelMixin(CacheDeleteMixin):
headers=headers)
def perform_create(self, serializer):
" Generic save hook "
serializer.save()
"""
Uses serializer.create instead of serializer.save to avoid making a
query. We save the returned instance list to the serializer in order to
be used as serializer.data during rendering
"""
assert hasattr(serializer, 'create'), (
f'Cannot call .create() on serializer {serializer.__class__} as'
' no such attribute exists.'
)
validated_data = serializer.validated_data
instance_list = serializer.create(validated_data)
# Check whatever you can
assert hasattr(instance_list, '__iter__'), (
'Method .create() on serializer on serializer '
f'{serializer.__class__} should return a list of serializable'
' model instances.'
)
serializer.instance = instance_list
def get_success_headers(self, data):
" Returns extra success headers "
@@ -179,9 +195,7 @@ class CachedListUpdateModelMixin(CacheDeleteMixin):
" Updates the list of entries in the request "
partial = kwargs.pop('partial', False)
queryset = self.filter_queryset(self.get_queryset())
serializer = self.get_serializer(queryset, data=request.data,
serializer = self.get_serializer(data=request.data,
partial=partial, many=True)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
@@ -192,8 +206,24 @@ class CachedListUpdateModelMixin(CacheDeleteMixin):
return Response(serializer.data)
def perform_update(self, serializer):
" Generic save hook "
serializer.save()
"""
Uses serializer.update instead of serializer.save to avoid making a
query. We save the returned instance list to the serializer in order to
be used as serializer.data during rendering
"""
assert hasattr(serializer, 'update'), (
f'Cannot call .update() on serializer {serializer.__class__} as'
' no such attribute exists.'
)
validated_data = serializer.validated_data
instance_list = serializer.update(None, validated_data)
# Check whatever you can
assert hasattr(instance_list, '__iter__'), (
'Method .update() on serializer on serializer '
f'{serializer.__class__} should return a list of serializable '
' model instances.'
)
serializer.instance = instance_list
def list_partial_update(self, request, *args, **kwargs):
" Needs to be called on partial updates "
@@ -211,16 +241,19 @@ class CachedListDestroyModelMixin(CacheDeleteMixin):
# Go on with the validation as normal
serializer = self.get_serializer(data=request.data, many=True)
serializer.is_valid(raise_exception=True)
validated_data = serializer.validated_data
# TODO does this new stuff work even? need to check on the frontend
serializer.delete(validated_data)
# for instance in self.get_objects():
# if instance is not None:
# self.perform_destroy(instance)
self.perform_destroy(serializer)
# Delete the related caches
self.delete_cache(request)
return Response(status=status.HTTP_204_NO_CONTENT)
def perform_destroy(self, serializer):
" Custom generic destroy hook "
assert hasattr(serializer, 'destroy'), (
f'Cannot call .destroy() on serializer {serializer.__class__} as'
' no such attribute exists.'
)
validated_data = serializer.validated_data
serializer.destroy(validated_data)