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

Xar*_*Xar 9 python django django-rest-framework

我正在使用django和djando休息框架

我已经创建了一个新的端点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']
Run Code Online (Sandbox Code Playgroud)

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

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

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')
Run Code Online (Sandbox Code Playgroud)

我总是遇到各种错误.

有关如何做到这一点的任何帮助?返回字符串列表的内容

更新

我试过@ 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
Run Code Online (Sandbox Code Playgroud)

我仍然会遇到错误.但是我没有在任何地方收到错误消息.有帮助吗?

zai*_*zil 15

你可以使用serializers.ListField,

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

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

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

class StringListField(serializers.ListField):
    child = serializers.CharField()
Run Code Online (Sandbox Code Playgroud)

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

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

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

class InstalledAppsSerializer(serializers.Serializer):

    name = serializers.CharField(max_length=256)

    child = serializers.CharField()

    installed_apps_field = StringListField()
Run Code Online (Sandbox Code Playgroud)


小智 7

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

class MySerializer(serializers.Serializer):
    installed_apps = serializers.ListSerializer(child=serializers.CharField())
Run Code Online (Sandbox Code Playgroud)

它返回

['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']
Run Code Online (Sandbox Code Playgroud)


e4c*_*4c5 2

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

列表字段

验证对象列表的字段类。

当您的班级成员之一是列表时,您可能需要使用它。但你不想将 ListField 作为序列化器,因为它不是一个

class InstalledAppsSerializer(serializers.Serializer):

    name = serializers.CharField(max_length=256)

    child = serializers.CharField()

    installed_apps_field = serializers.SerializerMethodField(
        'get_installed_apps')
Run Code Online (Sandbox Code Playgroud)