2017-09-07 2 views
0

Bonjour d'avoir des problèmes pour trouver la meilleure approche serait de créer un ensemble de routes comme celles-ci ci-dessous de préférence pour Django-reste-cadre. Les routes sont pseudocodes et sujettes à changement. Actuellement en utilisant Django 1,11Django REST Framework Routing

GET /api/<model>/<id> 
GET /api/<model>/?select=<feld1>,<feld2>,<feld3>,... 
GET /api/<model>/?top=20&skip=60 
GET /api/<model>/<id>/<model2> # Where Model2 is also a parameter which can change 
GET /api/<model>/?expand=<model2>,<model3>,... 
GET /api/<model>/?filter=<filter-string> 
GET /api/<model>/?search=<solr-query> 

Il devrait également être possible de combiner la recherche de ces sauf requête

Répondre

1

Tout d'abord, tout ce qui suit après ? est un QueryString, pas besoin de faire URL pour elle. Ensuite, il est préférable pratique, pour créer la route api/ dans la base urls.py fichier Et urls.py dans une autre application, sera 2 urls, comme celui-ci

url(r'^model/(?P<id>[0-9]+)$', view.id_view, name='id'), 
url(r'^model/(?P<id>[0-9]+)/(P<model>[\w]+)$', view.id_model_view, name='model') 
+0

hmm ouais. ça va faire. Mais je pensais utiliser une solution plus élégante (routeur). Mais là encore, je pourrais simplement copier coller ces URLs pour chaque modèle. – ShuzZzle

1

settings.py

REST_FRAMEWORK = { 
    ... 
    'DEFAULT_FILTER_BACKENDS': (
     # filter 
     'django_filters.rest_framework.DjangoFilterBackend', 
     # order 
     'rest_framework.filters.OrderingFilter', 
     # search 
     'rest_framework.filters.SearchFilter' 
    ), 
    ... 
    'ORDERING_PARAM': 'ordering', 
    'SEARCH_PARAM': 'search', 
} 

views.py

class MessageTemplateViewSet(ModelViewSet): 
    queryset = MessageTemplate.objects.all() 
    serializer_class = MessageTemplateListSerializer 
    permission_classes = (IsPublisherOrReadOnly,) 
    filter_class = MessageTemplateFilter 
    ordering_fields = '__all__' 
    search_fields = ('subject', 'content') 

filters.py

class MessageTemplateFilter(django_filters.rest_framework.FilterSet): 
    class Meta: 
     model = MessageTemplate 
     fields = { 
      'publisher': ['exact'], 
      'subject': ['exact', 'icontains'], 
      'content': ['exact', 'icontains'], 
      'is_private': ['exact'], 
     } 
filtre

est support par django-filter, avec cela, vous pouvez obtenir

GET /api/<model>/<id> 
GET /api/<model>/?top=20&skip=60 
GET /api/<model>/?filter=<filter-string> 
GET /api/<model>/?search=<solr-query> 

pour

GET /api/<model>/<id>/<model2> 

vous pouvez obtenir par drf-nested-routers

pour

GET /api/<model>/?select=<feld1>,<feld2>,<feld3>,... 

vous pouvez modifier par ce sérialiseur:

class DynamicFieldsModelSerializer(ModelSerializer): 
    """ 
    A ModelSerializer that takes an additional `fields` argument that 
    controls which fields should be displayed. 
    """ 

    def __init__(self, *args, **kwargs): 
     # Don't pass the 'fields' arg up to the superclass 
     fields = kwargs.pop('fields', None) 
     exclude = kwargs.pop('exclude', None) 

     # Instantiate the superclass normally 
     super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs) 

     if fields is not None: 
      # Drop any fields that are not specified in the `fields` argument. 
      allowed = set(fields) 
      existing = set(self.fields.keys()) 
      for field_name in existing - allowed: 
       self.fields.pop(field_name) 

     if exclude is not None: 
      not_allowed = set(exclude) 
      for exclude_name in not_allowed: 
       self.fields.pop(exclude_name) 

utilisation comme serializer = UserCreateSerializer(data=data, fields=('username', 'password', 'tel'))

qui est tout ce que je sais