簡體   English   中英

Django REST框架路由

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM