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
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