Django-REST框架路由

2024-04-20 07:47:25 发布

您现在位置:Python中文网/ 问答频道 /正文

您好,有问题想知道什么是最好的方法,最好是为Django rest框架创建一组如下所示的路由。路线是伪代码,可能会更改。目前正在使用django1.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>

除了搜索查询之外,还应该可以组合这些查询


Tags: django方法代码框架restapiid路由
2条回答

在设置.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',
}

在视图.py在

^{2}$

在过滤器.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支持的,有了它您可以实现

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-nested-routers实现

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)

使用likeserializer = UserCreateSerializer(data=data, fields=('username', 'password', 'tel'))

我只知道这些

首先,?后面的所有内容都是一个查询字符串,不需要为它创建URL。 接下来,最佳实践是在基urls.py文件中创建路由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')

相关问题 更多 >