2015-10-24 25 views
8

Django Rest Framework'ün Varsayılan Yönlendiricisini kullanıyorum ve bağlantılarımı özelleştirmeyi deneyin.Django dinlenme çerçevesi Yönlendirici - özelleştirilmiş URL ekleme ve işlevleri görüntüleme

nasıl şu şekilde böyle bir şey düzenlemek ayarlarım:

  1. /myModels/dosomething (ve API Kök görünümünde listelenir olsun)
  2. /myModels/addModel?name=abc&address=xyz

    Views.py

    class MyModelViewSet(viewsets.ModelViewSet): 
        queryset = MyModel.objects.all() 
        serializer_class = MyModelSerializer 
    

    Sen görünümlerde @detail_route veya @list_route dekoratörler kullanarak varsayılan bir yönlendiriciye daha son noktalarını ekleyebilir

    router = routers.DefaultRouter(trailing_slash=True) 
    router.register(r'mymodels', views.MyModelViewSet) 
    

cevap

6

urls.py. @detail_route/myModel/<id-of-model>/new-route/

yeni uç noktasını oluşturur oysa

@list_route Ancak tamamen Varsayılan yönlendirici tarafından sağlanan son noktalarını değiştirmek istiyorsanız, özel bir yönlendirici yazma düşünmek gerekir, /myModel/new-route/ yeni uç noktasını oluşturur.

DRF's documentation, özel yönlendiricinin yanı sıra örnek özel yönlendiricinin there örneğiyle iyi bir açıklamasına sahiptir.

defaultrouter göre, sizin viewset sınıfta görüşlerini beyan gerekir:

10

beni ViewSet ve router nasıl kullanılacağını göstermek edelim.

Ben kullanıcı API hakkında bir örnek vermek ve aşağıdaki size rehberlik: Temel dinlendirici api içeren UserViewSet bittiğinde

class UserViewSet(viewsets.ViewSet): 
    """Userviewset 
    Restful Structure: 
     | URL style  | HTTP Method | URL Nanme | Action Function | 
     |----------------|-------------|-------------|-----------------| 
     | /users   | GET, POST | user-list | user_list  | 
     | /users/<email> | GET, DELETE | user-detail | user_detail  | 
    """ 
    # Router class variables 
    lookup_field = 'email' 
    lookup_value_regex = '[\w.%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}' 

    # Viewsets class variables 
    #queryset = User.objects.all() 

    def list(self, request): 
     """GET - Show all users""" 
     print request.version 
     api_result = user_list.lists_all_users() 
     return Response(api_result) 

    def create(self, request): 
     """POST - Add new user""" 
     api_result = user_list.create_new_user(request.data) 
     return Response(api_result) 

    def retrieve(self, request, email=None): 
     """GET - Show <email> user""" 
     api_result = user_detail.retrieve_the_user(email) 
     return Response(api_result) 

    def partial_update(self, request, email=None): 
     return Response() 

    def destroy(self, request, email=None): 
     """DETELE - Delete <email> user""" 
     api_result = user_detail.destroy_the_user(email) 
     return Response(api_result) 

, ben router kayıt:

router = routers.SimpleRouter(trailing_slash=False) 
router.register(prefix=r'users', viewset=UserViewSet, base_name='user') 

Yani olacak Karşılık gelen urller ile üretilir:

  • list ve create gelen url ile şunlardır: /users
  • retrieve, partial_update ve destroy karşılık gelen url ile şunlardır:

    : /users/<email>

Eğer viewset genişletmek için list_route veya detail_route kullanmalıdır, sen URL'ler daha eklemek özelleştirmek gerekir varsayalım

@list_route(methods=['post']) 
def login(self, request): 
    """POST - login by user""" 
    ... 

Yani yeni eylem, ilgili URL ile ilgili:

  • login karşılık gelen url ile geçerli: /users/login

Ben size yardımcı olabilir umuyoruz.

+0

Kullanıcı_adı ve kullanıcı_adı nesnelerinizin neye başvurduğunu açıklar mısınız? –

İlgili konular