как связать миксин набора запросов для остальных наборов представлений django?

Мне нужно написать следующие миксины запросов:

class VendorOwnedQuerySetMixin(models.QuerySet):
    def get_objects_for_vendor(self, request):
        vendor_user = VendorUserModel.objects.get(user=request.user)
        return qs.filter(vendor=vendor_user.vendor)


class OrganizationOwnedQuerySetMixin(object):
    def get_objects_for_organization(self, request):
        return self.filter(organization__domains__name=hostname_from_request(request))

Все работает хорошо, потому что некоторые менеджеры моделей наследуют первый миксин, а некоторые — второй.

Затем внутри get_queryset набора представлений я вызову соответствующий метод get_objects.

пример

def get_queryset(self, queryset=None):
        return Some.objects.get_objects_for_organization(self.request)

Теперь мне нужно иметь набор представлений django rest, который должен запускать метод get_queryset, который запускает оба фильтра.

Как мне «связать» их в методе get_queryset? Потому что я хочу повторно использовать свой код, где это возможно


person Kim Stacks    schedule 10.08.2019    source источник


Ответы (1)


Чтобы связать фильтры, вам нужно получить предыдущий набор запросов. Этого можно добиться, вызвав super().get_queryset(request). Он получит набор запросов из других классов, от которых наследуется ваше представление, и применит фильтр:

class VendorOwnedQuerySetMixin(models.QuerySet):
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        vendor_user = VendorUserModel.objects.get(user=request.user)
        return qs.filter(vendor__user=vendor_user.vendor)


class OrganizationOwnedQuerySetMixin(object):
    def get_objects_for_organization(self, request):
        qs = super().get_queryset(request)
        return qs.filter(organization__domains__name=hostname_from_request(request)

Помните, что вы ДОЛЖНЫ устанавливать примеси перед представлением, чтобы оно работало. Например:

class MyView(OrganizationOwnedQuerySetMixin, VendorOwnedQuerySetMixin, RetrieveAPIView):
    ...

Вызов get_queryset получит набор запросов RetrieveAPIView, который будет передан VendorOwnedQuerySetMixin после возврата вызова super(), применит фильтр и вернет результат OrganizationOwnedQuerySetMixin после вызова super(), который, в свою очередь, применит свой фильтр и вернет результат.

person Linovia    schedule 10.08.2019