使用多个查找字段休息调用以进行反向查找

mar*_*ele 9 python django rest django-rest-framework

在Django休息框架中,有没有办法拥有多个查找字段?我知道这听起来不是很REST友好.

我有一个Company模型,我想首先通过他们的国家列出它们,然后通过一个slug字段列出它们,例如:/companies/<iso_country>/<slug>/.有没有办法做到这一点?

小智 10

创建mixin,如:

class MultipleFieldLookupMixin(object):
    def get_object(self):
        queryset = self.get_queryset()             # Get the base queryset
        queryset = self.filter_queryset(queryset)  # Apply any filter backends
        filter = {}
        for field in self.lookup_fields:
            filter[field] = self.kwargs[field]
        return get_object_or_404(queryset, **filter)  # Lookup the object
Run Code Online (Sandbox Code Playgroud)

并将此mixin添加到您的视图集:

class YourCountryViewSet(MultipleFieldLookupMixin, generics.RetrieveAPIView):
    lookup_fields = ('iso_country', 'slug')

...
Run Code Online (Sandbox Code Playgroud)

来源:http://www.django-rest-framework.org/api-guide/generic-views/#creating-custom-mixins


daj*_*jee 0

假设您使用的是路由器,我认为您可以执行以下操作:

router.register(r'companies/(?P<iso_country>[^/.]+)/', YourCompanyViewSet, 'company-base')
Run Code Online (Sandbox Code Playgroud)

您必须在 ViewSet 中定义slug为您的位置。lookup_field

例如,你的课程看起来像

class YourCountryViewSet(GenericViewSet):
     lookup_field = 'slug'

    def create(self, request, iso_country):
        ...

    def retrieve(self, request, iso_country, slug):
        ...
Run Code Online (Sandbox Code Playgroud)