Построение объектов Q динамически или NOP - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь построить фильтр динамически на основе переданных параметров запроса.Код ниже.Поскольку фильтр может оказаться пустым, и в этом случае все объекты должны быть возвращены, это очень уродливо.

Есть ли способ сделать это чисто?Может быть, если есть Q по умолчанию, что означает «не ничего»?

def get(self, request, *args, **kwargs):
    q = None
    for field, value in request.GET.items():
        if field not in Project._meta.fields:
            continue
        if q is None:
            q = Q(**{'{}'.format(field): value})
        else:
            q &= Q(**{'{}'.format(field): value})

    if q is None:
        projects = get_objects_for_user(request.user, ['api.view_project', 'api.edit_project', 'api.owner_project'], any_perm=True)
    else:
        projects = get_objects_for_user(request.user, ['api.view_project', 'api.edit_project', 'api.owner_project'], any_perm=True).filter(q)

    ser = ProjectSerializer(projects, many=True)

    return Response(ser.data, status=status.HTTP_200_OK)

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Я рекомендую использовать django-filter :

Пример класса фильтра:

import django_filters

class ProjectFilter(django_filters.FilterSet):

    class Meta:
        model = Product
        fields = [
            'id',
            'name',
            'user',
            'user__username',
        ]

Пример функции просмотра:

def get(self, request, *args, **kwargs):
    projects = get_objects_for_user(request.user, ['api.view_project', 'api.edit_project', 'api.owner_project'], any_perm=True)

    projects = ProjectFilter(request.GET, queryset=projects)

    ser = ProjectSerializer(projects, many=True)

    return Response(ser.data, status=status.HTTP_200_OK)
0 голосов
/ 01 марта 2019

Просто Q() вообще ничего не должно фильтровать.

...