代码之家  ›  专栏  ›  技术社区  ›  Kim Stacks

如何为Django休息视图集链接QuestSuff-MIXIN?

  •  0
  • Kim Stacks  · 技术社区  · 5 年前

    我需要写下面的QuestSuff-MIXIN:

    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))
    

    所有的工作都很好,因为一些模型管理者将继承第一个MIXIN,一些继承第二个MIXIN。

    然后在里面 get_queryset 在viewset中,我将调用适当的get_objects方法。

    例子

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

    现在我需要一个django rest视图集来运行 获取查询集 运行两个筛选器的方法。

    我如何将它们“连锁”在 获取查询集 方法?因为我想在可能的情况下重用我的代码

    0 回复  |  直到 5 年前
        1
  •  0
  •   Linovia    5 年前

    为了链接过滤器,需要获取上一个queryset。这可以通过调用 super().get_queryset(request) . 它将从视图继承的其他类中获取queryset并应用筛选器:

    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 将传递到的queryset VendorOwnedQuerySetMixin 一旦 super() 调用返回,应用筛选器并将结果返回给 OrganizationOwnedQuerySetMixin 之后 超级() 调用,然后应用其筛选器并返回结果。