2016-07-19 25 views
6

Tôi có nhiều API mà trong lịch sử hoạt động sử dụng id như lĩnh vực tra cứu:Nhiều lookup_fields cho django còn lại khung

/api/organization/10 

Tôi có một lối vào tiêu thụ những api.

Tôi đang xây dựng một giao diện mới và đối với một số lý do, tôi muốn sử dụng một sên thay vì một id:

/api/organization/my-orga 

API được xây dựng với Django Nghỉ ngơi khung. Ngoại trừ sự thay đổi của trường tra cứu, hành vi api nên giữ nguyên.

Có giải pháp nào để cho phép API của tôi hoạt động với cả slugpk không? Hai con đường nên cung cấp cho họ kết quả tương tự:

/api/organization/10 
/api/organization/my-orga 

Dưới đây là định nghĩa API của tôi:

# urls.py 
router = DefaultRouter() 
router.register(r'organization', Organization) 
urlpatterns = router.urls 

#view.py 
class Organization(viewsets.ModelViewSet): 
    queryset = OrganisationGroup.objects.all() 
    serializer_class = OrganizationSerializer 

# serializer.py 
class OrganizationSerializer(PermissionsSerializer): 
    class Meta: 
     model = Organization 

Nhờ sự giúp đỡ của bạn.

+0

Điều này có thể có lợi: http://www.django-rest-framework.org/api-guide/serializers/#how-hyperlinked-views-are-determined – jape

+0

Xin chào Alex, bạn có thể tìm được giải pháp tốt hay không cho điều này? – Vinch

Trả lời

6

Hãy thử điều này

from django.db.models import Q 
import operator 
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] 
     q = reduce(operator.or_, (Q(x) for x in filter.items())) 
     return get_object_or_404(queryset, q) 

Sau đó, trong Xem

class Organization(MultipleFieldLookupMixin, viewsets.ModelViewSet): 
    queryset = OrganisationGroup.objects.all() 
    serializer_class = OrganizationSerializer 
    lookup_fields = ('pk', 'another field') 

Hope this helps.

+0

Tôi nghĩ rằng nó không trả lời câu hỏi vì URL phải chứa cả pk và trường khác trong trường hợp đó. – Vinch

0

class MultipleFieldLookupMixin(object): 
 
    """ 
 
    Apply this mixin to any view or viewset to get multiple field filtering 
 
    based on a `lookup_fields` attribute, instead of the default single field filtering. 
 
    """ 
 

 
    def get_object(self): 
 
     queryset = self.get_queryset() # Get the base queryset 
 
     queryset = self.filter_queryset(queryset) 
 
     filter = {} 
 
     for field in self.lookup_fields: 
 
      if self.kwargs[field]: # Ignore empty fields. 
 
       filter[field] = self.kwargs[field] 
 
     return get_object_or_404(queryset, **filter) # Lookup the object 
 

 

 
class RetrieveUserView(MultipleFieldLookupMixin, generics.RetrieveAPIView): 
 
    queryset = User.objects.all() 
 
    serializer_class = UserSerializer 
 
    lookup_fields = ('account', 'username')

0

Tôi nghĩ câu trả lời cơ bản là điều này sẽ không được tốt thiết kế REST/API và chỉ không phải là điều DRF sẽ cho phép.

Các vấn đề liên quan