Есть вьюха на rest framework, в filter_queryset фильтруется базовый запрос в зависимости от пользователя или даты.
Не понимаю почему, но бывает если фильтруешь по пользователю вылезают дублирующиеся ресурсы. Если со временем в принципе понятно откуда они, то по пользователям грешу на внешние ключи. При использовании distinct() лишнее я фильтровал в return queryset.distinct('pk') в конце функции. Сейчас другой программист в serealizer е добавил расчет опирающийся на queryset.count() и return queryset.distinct('pk') валиться с ошибкой. Вот хотел узнать как лучше ручками изобразить действие distinct над кверисетом, без возможности делать длинные списки и множества
class SourcePaginatedAPIView(generics.ListAPIView):
queryset = Source.objects.all().prefetch_related()
serializer_class = SourceSerializer
pagination_serializer_class = SizeSourcePaginatedSerializer
paginate_by = 10
paginate_by_param = 'page_size'
max_paginate_by = 100
def get(self, request, *args, **kwargs):
self.paginate_by = self.kwargs.get('paginate_count', None)
return self.list(request, *args, **kwargs)
def filter_queryset(self, queryset):
filters = self.request.GET.get('filter', '')
datesCreateTask = filters.get('datesCreate', {})
users = filters.get('users', {})
if datesCreateTask:
data_query = Source.objects.none()
for date in datesCreateTask:
start_date = datetime.strptime(date['value1']+'.23:59', '%d.%m.%Y.%H:%M')
stop_date = datetime.strptime(date['value2']+'.23:59', '%d.%m.%Y.%H:%M')
data_query = data_query|Source.objects.filter(Q(sourceprocessing__task__create_time__gte=start_date) & Q(sourceprocessing__task__create_time__lte=stop_date))
queryset = queryset&data_query
if users:
# task = Task.objects.filter(user__username__in=[user['value'] for user in users])
# subtask = Subtask.objects.filter(task__in=task)
# user_query = Source.objects.filter(Q(subtask__in=subtask))
queryset = queryset.filter(Q(sourceprocessing__task__user__pk__in=(user['value'] for user in users)))
return queryset