Я использую django-filters
для фильтрации данных на основе классов.Я использую filter_class
в представлении на основе классов, которое выполняет начальную фильтрацию наборов.И у меня есть отдельный фильтр, который фильтрует вывод по требованию.
filters.py
class BookingFilterBackend(DRYPermissionFiltersBase):
def filter_list_queryset(self, request, queryset, view):
if request.user.is_role_admin:
return queryset
if request.user.is_role_client:
return queryset.filter(Q(client=request.user.client))
if request.user.is_role_camop:
return queryset.filter(Q(camera_operator=request.user))
return queryset.filter(Q(created_by=request.user))
class FilterOne(filters.FilterSet):
title = filters.CharFilter(method=filter_booking_title)
class Meta:
model = models.Booking
fields = [
'title',
'state',
'client',
]
class FilterTwo(filters.FilterSet):
client = filters.ModelMultipleChoiceFilter(queryset=users_models.Client.objects.all())
state = filters.MultipleChoiceFilter(choices=constants.BookingState)
camera_operator = filters.ModelMultipleChoiceFilter(queryset=users_models.UserManager.camop_users())
date_start = filters.DateFilter(name='date', lookup_expr='startswith')
date_end = filters.DateFilter(name='date', lookup_expr='endswith')
class Meta:
model = models.Booking
fields = [
'state',
'client',
'camera_operator',
'date_start',
'date_end',
]
api.py
class MyViewSet(
MultipleSerializerMixin,
mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.ListModelMixin,
viewsets.GenericViewSet
):
lookup_field = 'uuid'
queryset = models.Booking.objects.all()
filter_backends = [filters.BookingFilterBackend, DjangoFilterBackend, ]
filter_class = filters.FilterOne
pagination_class = BookingViewSetPagination
serializer_class = serializers.BookingDetailSerializer
serializer_classes = {
...
}
@list_route(methods=['POST'], url_path='export-bookings')
def export_bookings(self, request, *args, **kwargs):
queryset = self.get_queryset()
// just some debugging code
query_dict = request.data
print(query_dict.get('state', []))
print(query_dict.get('clients', []))
print(query_dict.get('camera_operators', []))
print(query_dict.get('from_date', ''))
print(query_dict.get('to_date', ''))
// Apply the filter set - FilterTwo - on my model objects -> Booking. Something like this:
// filtered_queryset = filters.FilterTwo(queryset, query_dict) - ??
return response.NoContent()
Однако я не могу понять, как написать то утверждение, которое вызывает FilterTwo
с the query dictionary
(получено в теле вызова POST) и оригинальным queryset
.
Во-вторых, У меня есть поле date
в моём модале, и я хочу выполнить в этом поле больший_ меньший и меньший.Мне интересно, правильно ли написана моя логика фильтра.