Django Rest Framework: XLSXRenderer - Как проверить условие для набора запросов и вернуть ответ
from rest_framework.viewsets import ReadOnlyModelViewSet
from drf_renderer_xlsx.mixins import XLSXFileMixin
from drf_renderer_xlsx.renderers import XLSXRenderer
from .models import MyExampleModel
from .serializers import MyExampleSerializer
class MyExampleViewSet(XLSXFileMixin, ReadOnlyModelViewSet):
serializer_class = MyExampleSerializer
renderer_classes = [XLSXRenderer]
filename = 'my_export.xlsx'
def get_queryset(self):
start_date = self.request.query_params.get('start_date', None)
end_date = self.request.query_params.get('end_date', None)
queryset = MyExampleModel.objects..filter(created__range=[start_date, end_date])
Return queryset
# What I want to do
# If not queryset:
# Return Response({"message": "Exporting Fail"})
# Is there a way to check if queryset is None and return a Error Message instead of an empty Excel
# I think that I not allow return Response in the get_queryset function
В настоящее время я пытаюсь создать функцию для экспорта файла Excel. Я просто хочу знать, есть ли способ проверить, является ли набор запросов None, а затем я могу вернуть ответ ({"message": "Exporting Fail, Empty"})
Если вы знаете, где я могу найти информацию, это мне очень поможет. Большое спасибо
1 ответ
Вы должны выполнять фильтрацию в
filter_queryset
или так то, что у вас уже есть, правильно. Но
get_queryset
должен вернуть
queryset
, а не
Response
объект.
Вы получите доступ к фактическому объекту в методе.
def get_object(self):
"""
Returns the object the view is displaying.
You may want to override this if you need to provide non-standard
queryset lookups. Eg if objects are referenced using multiple
keyword arguments in the url conf.
"""
queryset = self.filter_queryset(self.get_queryset())
# Perform the lookup filtering.
lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field
assert lookup_url_kwarg in self.kwargs, (
'Expected view %s to be called with a URL keyword argument '
'named "%s". Fix your URL conf, or set the `.lookup_field` '
'attribute on the view correctly.' %
(self.__class__.__name__, lookup_url_kwarg)
)
filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]}
obj = get_object_or_404(queryset, **filter_kwargs)
# May raise a permission denied
self.check_object_permissions(self.request, obj)
return obj
Если вы не хотите повышать 404, если набор запросов пуст, вам придется сначала настроить эти несколько последних строк.
Тогда, как вы можете только
retrieve
а также
list
в вашем наборе представлений настройте эти методы соответствующим образом.
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
if not instance:
return Response({"message": "Exporting Fail"})
serializer = self.get_serializer(instance)
return Response(serializer.data)
Или ты не меняешь
get_object
вообще и обрабатывать 404
def retrieve(self, request, *args, **kwargs):
try:
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
except Http404:
return Response({"message": "Exporting Fail"})
но я думаю, это не чистое решение.