【问题标题】:Customize the Django Swagger Framework自定义 Django Swagger 框架
【发布时间】:2017-12-27 14:22:22
【问题描述】:

我正在寻找如何通过 refClient(我的客户模型中的独特 CharField)在 django swagger 框架中制作 GET。 我在互联网上发现我必须自定义路由器,我将其作为路由器:

from rest_framework.schemas import get_schema_view
from rest_framework_swagger.renderers import SwaggerUIRenderer, OpenAPIRenderer

schema_view = get_schema_view(
    title='Swagger documentation',
    renderer_classes = [OpenAPIRenderer, SwaggerUIRenderer],
)

# Routers provide an easy way of automatically determining the URL conf.
router = routers.DefaultRouter(trailing_slash=False)
router.register(r'clients/{refClient}', ClientViewSet)

# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # To show the swagger documentation
    url(r'^swagger/', schema_view, name="docs"),
    url(r'^api/v1/', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
   ] 

但我得到了这个错误

ValueError: invalid literal for int() with base 10: 'refClient'
[21/Jul/2017 15:25:22] "GET /swagger/ HTTP/1.1" 500 133494

我是否应该在我的序列化程序的配置中添加一些东西

class ClientSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Client
        fields = ('refClient', 'nom', 'prenom')

还是我的看法?

class ClientViewSet(viewsets.ModelViewSet):
    queryset = Client.objects.all()
    serializer_class = ClientSerializer

    def get_queryset(self):
        """ GET : get all clients """
        return Client.objects.all()

    def create(self, request):
       """ POST : Create a Client object """
        return super(ClientViewSet, self).create(request)

    def retrieve(self, request, pk=None):
        """ GET : Returns a single client item """
        return super(ClientViewSet, self).retrieve(request, pk)

    def update(self, request, *args, **kwargs):
        """ PUT : Updates a single client item """
        return super(ClientViewSet, self).update(request, *args, **kwargs)

    def partial_update(self, request, *args, **kwargs):
        """ PATCH : Partiel update a client """
        return super(ClientViewSet, self).partial_update(request, *args, **kwargs)

    def destroy(self, request, pk=None):
        """ DELETE : Delete a client """
        return super(ClientViewSet, self).destroy(request, pk)

基本上我可以如何自定义我的招摇?

【问题讨论】:

  • 你也可以发布客户端模型吗?

标签: django django-rest-framework django-swagger


【解决方案1】:

默认情况下,django rest 框架使用这个 lookup_field = 'pk' lookup_url_kwarg = None

您可以在您的 ClientViewSet 类中覆盖它,更改为 lookup_field = 'refClient'

但是,如果您想通过“pk”或“refClient”同时支持这两种查找,我建议为后者使用不同的端点(例如/api/client_url/ref/),或者在您的列表视图(例如 /api/client_url?refClient='something')

【讨论】:

  • 谢谢!这对我行得通。您知道如何在 django rest swagger 中制作复杂的路由器吗? (例如,如果我的客户端对象在模型中包含文章属性 ManyToMany,并且我希望有这样的路线;在招摇中,client/{refClient}/articles/{refArticle})。谢谢
  • 我不是拥有嵌套路由器的忠实拥护者,我会将其视为具有这样的 url 模式:client/<ref>/articles/ 指向 ClientArticlesViewSet(ModelViewSet),您将在其中覆盖 get_queryset() 以进行过滤来自 self.kwargs 的 。通过这种方式,您的端点将表现为文章的普通路由器,但具有该过滤器。 kwargs 应该在 swagger 中可用。
  • 请你看看下面的答案。谢谢
  • 我应该将 refClient 添加到文章的模型中吗?再次感谢
  • 我没有看到任何答案。也许你应该为此创建一个新问题
猜你喜欢
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多