2014-01-26 81 views
7

在Django rest框架中,是否有一種方法可以有多個查找字段?我知道這聽起來不太好REST友好。具有多個查找字段的其他調用進行反向查找

我有一個Company模型,我想先列出他們通過他們的國家,然後通過一個slug字段,如:/companies/<iso_country>/<slug>/。有沒有辦法做到這一點?

回答

0

假設你正在使用路由器,我覺得你可以這樣做:

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

如果您在您的視圖集中定義slug爲您lookup_field

再比如說,你的類看起來像

class YourCountryViewSet(GenericViewSet): 
    lookup_field = 'slug' 

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

    def retrieve(self, request, iso_country, slug): 
     ... 
6

創建混入,如:

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 

這混入添加到您的視圖集中:

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

... 

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

+0

比ks,我會盡可能嘗試。這聽起來像我需要的工作。 – marcaurele

+0

在這種情況下,url模式是什麼,我們是否應該註冊一個新模式?或者'model-detail'請求的URL是什麼?像'example.com/api/pk /'是單個查找字段,現在是'example.com/api/iso_country/slug /'? – TonyTony

+0

是啊,網址:'example.com/api/ / /' – Bulgantamir