[Django rest framework]:序列化字符串列表

时间:2017-06-05 10:19:06

标签: python django django-rest-framework

我正在使用django和djando rest framework

我已经创建了一个新的端点installedapps`。在向它发出GET请求时,我想返回字符串列表中包含的数据(已安装的应用程序列表)

字符串列表如下所示:

installed_apps = ['django_admin_bootstrapped', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.humanize', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'django_js_reverse', 'djcelery', 'bootstrap3', 'foo', 'bar', 'apirest']

到目前为止,我只使用模型序列化器,一切都很简单。但现在我不知道如何返回这个字符串列表

这是我到目前为止所尝试的:

class InstalledAppsViewSet(viewsets.ViewSet):
    serializer_class = serializers.InstalledAppsSerializer

    def list(self, request):
        from credits.views import GetInstalledApps

        installed_apps = GetInstalledApps.get_installed_apps()

        serializer = serializers.InstalledAppsSerializer(
            instance=installed_apps, many=True)

        return Response(serializer.data)




class InstalledAppsSerializer(serializers.ListField):

    name = serializers.CharField(max_length=256)

    child = serializers.CharField()

    installed_apps_field = serializers.SerializerMethodField(
        'get_installed_apps')

我总是遇到各种各样的错误。

有关如何执行此操作的任何帮助?返回字符串列表的内容

更新

我试过@ e4c5代码,就这样了:

class InstalledAppsViewSet(viewsets.ViewSet):
    serializer_class = serializers.InstalledAppsSerializer

    def list(self, request):

        serializer = serializers.InstalledAppsSerializer


class InstalledAppsSerializer(serializers.Serializer):

    name = serializers.CharField(max_length=256)

    child = serializers.CharField()

    installed_apps = serializers.SerializerMethodField('get_the_installed_apps')


    def get_the_installed_apps(self):
        from credits.views import GetInstalledApps
        installed_apps = GetInstalledApps.get_installed_apps()

        return installed_apps

我仍然会遇到错误。但我不会在任何地方收到错误消息。有什么帮助吗?

4 个答案:

答案 0 :(得分:12)

您可以使用serializers.ListField

  

ListField是一个验证对象列表的字段类。

     

ListField类还支持声明式样式,允许您编写可重用的列表字段类。

您可以为继承自ListField的序列化程序编写一个自定义字段,形成接受字符串列表的drf序列化程序。也许是这样,这个例子已经在DRF文档中显示了。

class StringListField(serializers.ListField):
    child = serializers.CharField()
  

我们现在可以在整个应用程序中重用我们的自定义StringListField类,而不必为其提供子参数。

这些来自文档,我还没有尝试过。但希望你得到你想要的东西。

您可以在序列化程序中使用自定义字段,例如

class InstalledAppsSerializer(serializers.Serializer):

    name = serializers.CharField(max_length=256)

    child = serializers.CharField()

    installed_apps_field = StringListField()

答案 1 :(得分:2)

如果您将序列化程序基于序列化程序而不是序列化程序字段,则“各种错误”可能会消失

ListField

  

验证对象列表的字段类。

当您的某个成员是列表时,您可能希望使用它。但是你不希望ListField成为一个序列化器,因为它不是一个

class InstalledAppsSerializer(serializers.Serializer):

    name = serializers.CharField(max_length=256)

    child = serializers.CharField()

    installed_apps_field = serializers.SerializerMethodField(
        'get_installed_apps')

答案 2 :(得分:1)

它适用于序列化字符串列表

class MySerializer(serializers.Serializer):
    installed_apps = serializers.ListSerializer(child=serializers.CharField())

它回来了

['django_admin_bootstrapped', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.humanize', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'django_js_reverse', 'djcelery', 'bootstrap3', 'foo', 'bar', 'apirest']

答案 3 :(得分:0)

对于

  

我仍然遇到错误。但是我没有收到错误信息   任何地方。

问题的一部分:错误应该出在您发送请求后从视图收到的响应中。

如果您有类似的内容:
response = InstalledAppsViewSet.as_view()(request, **kwargs)

打印响应的内容:
response.render().content-错误应该存在。