[英]Having trouble in routing ( giving urls or path) in Django Rest Framework
[英]Django REST Framework Routing
您好,在弄清楚最好的方法是為Django-rest-framework創建如下所示的路由集時遇到問題。 路由是偽代碼,可能會更改。 當前使用Django 1.11
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>
除了搜索查詢外,還應該可以將它們組合在一起
首先,之后是?
是QueryString,無需為其創建URL。 接下來,最佳實踐是在基本urls.py
文件中創建route api/
,而在另一個應用程序中的urls.py
將是2個url,如下所示
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')
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')
filter.py
class MessageTemplateFilter(django_filters.rest_framework.FilterSet):
class Meta:
model = MessageTemplate
fields = {
'publisher': ['exact'],
'subject': ['exact', 'icontains'],
'content': ['exact', 'icontains'],
'is_private': ['exact'],
}
django-filter支持filter ,您可以實現
GET /api/<model>/<id>
GET /api/<model>/?top=20&skip=60
GET /api/<model>/?filter=<filter-string>
GET /api/<model>/?search=<solr-query>
對於
GET /api/<model>/<id>/<model2>
您可以通過drf嵌套路由器來實現
對於
GET /api/<model>/?select=<feld1>,<feld2>,<feld3>,...
您可以通過以下序列化器進行修改:
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)
使用像serializer = UserCreateSerializer(data=data, fields=('username', 'password', 'tel'))
這是我所知道的一切
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.