【问题标题】:[Django rest framework]: Serialize a list of strings[Django rest框架]:序列化字符串列表
【发布时间】:2017-06-05 10:19:06
【问题描述】:

我正在使用 django 和 djando rest 框架

我创建了一个新端点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

而且我仍然遇到错误。但是我在任何地方都没有收到错误消息。有什么帮助吗?

【问题讨论】:

  • “我仍然遇到错误。但我没有在任何地方收到错误消息”不是很矛盾吗?
  • 我在浏览器中收到错误 500,但我看不出是什么导致了此类错误。
  • 你显然需要查看日志文件

标签: python django django-rest-framework


【解决方案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']

【讨论】:

    【解决方案2】:

    您可以使用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()
    

    【讨论】:

      【解决方案3】:

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

      ListField

      验证对象列表的字段类。

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

      class InstalledAppsSerializer(serializers.Serializer):
      
          name = serializers.CharField(max_length=256)
      
          child = serializers.CharField()
      
          installed_apps_field = serializers.SerializerMethodField(
              'get_installed_apps')
      

      【讨论】:

      • 谢谢@e4c5 我用我如何更改我的代码更新了我的答案。任何帮助将不胜感激
      【解决方案4】:

      对于

      而且我仍然遇到错误。但我没有收到错误消息 任何地方。

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

      如果你有类似的东西:
      response = InstalledAppsViewSet.as_view()(request, **kwargs),

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

      【讨论】:

        猜你喜欢
        • 2018-03-08
        • 1970-01-01
        • 2017-02-09
        • 2015-07-06
        • 2020-10-30
        • 1970-01-01
        • 2015-06-29
        • 2020-10-02
        • 1970-01-01
        相关资源
        最近更新 更多