2016-02-08 11 views
10

mam browsable API:Mix Zobacz i ViewSet w do przeglądania api_root

restaurant_router = DefaultRouter() 
restaurant_router.register(r'rooms', RoomsViewSet) 
restaurant_router.register(r'printers', PrintersViewSet) 
restaurant_router.register(r'shifts', ShiftsViewSet) 

urlpatterns = patterns('', 
    url(r'^$', api_root), 
    url(r'^restaurant/$', 
     RestaurantView.as_view(), 
     name='api_restaurants_restaurant'), 
    url(r'^restaurant/', include(restaurant_router.urls)), 
) 

W api_root mogę połączyć do nazwanego trasy:

@api_view(('GET',)) 
def api_root(request, format=None): 
    return Response({ 
     'restaurant': reverse('api_restaurants_restaurant', request=request, format=format), 
    }) 

Albo mogę używać możliwym do przeglądania API wygenerowany przez DefaultRouter, jak wyjaśniono w dokumentacji:

Klasy DefaultRouter używamy również utomatycznie tworzy dla nas widok główny API , dzięki czemu możemy teraz usunąć metodę api_root z naszego modułu widoków .

Co mam zrobić, jeśli chcę wymieszać ze standardowymi widokami ViewSet s i wyświetlić wszystko w tym samym katalogu głównym interfejsu API? DefaultRouter wyświetla tylko listę ViewSet, którą kontroluje.

+1

Co rozumiesz przez "mieszanie zestawów widoków i widoków normalnych". Co dokładnie chcesz robić? – mariodev

+0

@mariodev: Chcę mieć przeglądany widok API (automatycznie generowane drzewo przeglądania), gdzie niektóre adresy URL są generowane z zestawu widoków, a niektóre z widoków normalnych. Działa to, gdy masz DefaultRouter z ViewSets, ale zaraz po rozpoczęciu dodawania url_patterns pochodzących z Views (nie ViewSets), rozkłada się. – dangonfast

Odpowiedz

-1

Wygląda na to, że nie można tego łatwo zrobić za pomocą DefaultRoutera, trzeba zbudować własny router. Jeśli jest to jakaś pociecha, to logika DefaultRouter do generowania widoku APIRoot jest dość prosta i prawdopodobnie możesz łatwo przetasować swój własny, podobny router na podstawie klasy DefaultRouter (np. Zmodyfikuj implementację klasy ApiRoot, aby pobrać dodatkowe adresy URL do uwzględnienia, możesz to zrobić dowolnie wiele sposobów, na przykład przekazać je do konstruktora routera):

https://github.com/tomchristie/django-rest-framework/blob/86470b7813d891890241149928d4679a3d2c92f6/rest_framework/routers.py#L263

1

można zdefiniować swoje poglądy jak ViewSets tylko z jednej metody. Dzięki temu możesz zarejestrować go w routerze i będzie on w jednym miejscu z ViewSets.

http://www.django-rest-framework.org/api-guide/viewsets/

+0

Może działać. Czy masz tego przykład? – dangonfast

+0

Jeśli zamierzasz pracować z Django-rest-framework, przygotuj się na czytanie kodu źródłowego i dokumentacji. To bardzo pomaga. Nie mogę podać kodu, ponieważ zależy to od kodu widoku. Wypróbuj przykłady dostępne przez link wspomniany powyżej, a będziesz mógł odpowiednio zmodyfikować swój kod. –

+0

Kod będzie wyglądać jak w komentarzu na rąbku, ale kod z other_forms_view powinien być napisany w metodzie RoomsViewSet.list. Lub inną metodą - zależy to od kodu widoku. –

-1

Od http://www.django-rest-framework.org/api-guide/viewsets/:

ViewSet klasa jest po prostu rodzajem klasy oparte View, który nie przewiduje żadnych teleskopowe sposobem takim jak .get() lub .post() i zamiast przewiduje działania, takie jak .list() i() .create

co oznacza, że ​​możemy rozszerzyć ViewSets:

def other_rooms_view(request): 
    return Response(...) 


class RoomsViewSet(ViewSet): 
    ... 

    def list(self, request): 
     return other_rooms_view(request) 

restaurant_router = DefaultRouter() 
restaurant_router.register(r'rooms', RoomsViewSet) 
+0

Er ... dlaczego spadł? – knite

+0

Nie przesłałem opinii, ale może tak być, ponieważ Twój przykład nie miesza się z Widokami i Widokami, na tym właśnie polega moje pytanie.I * już * wiem, jak wygenerować interfejs API do przeglądania z tylko ViewSets (jest to rzeczywiście w przewodniku, jak poprawnie wskazuje). Jak dodać widoki i utrzymać działanie automatycznego drzewa przeglądania? – dangonfast