2017-06-05 79 views
2

我正在使用django和djando rest框架[Django rest框架]:序列化字符串列表

我hace創建了一個新的端點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 

我仍然得到錯誤。但是我沒有收到任何地方的錯誤消息。任何幫助?

+0

「我仍然得到錯誤。但我不隨地收到錯誤消息」是不是矛盾嗎? – e4c5

+0

我在瀏覽器中收到錯誤500,但是我沒有看到是什麼導致了這樣的錯誤。 – Xar

+0

您顯然需要查看日誌文件 – e4c5

回答

2

的「各種錯誤」,如果你根據你的串行器串行器,而不是串行場

ListField

一個領域類,驗證對象的列表可能會消失。

您可能想要在班級的其中一個成員是列表時使用它。但是,你不想ListField爲串行,因爲它不是一個

class InstalledAppsSerializer(serializers.Serializer): 

    name = serializers.CharField(max_length=256) 

    child = serializers.CharField() 

    installed_apps_field = serializers.SerializerMethodField(
     'get_installed_apps') 
+0

謝謝@ e4c5我更新了我的答案以及如何更改我的代碼。任何幫助,將不勝感激 – Xar

+1

請閱讀這三個鏈接:http://stackoverflow.com/help/someone-answers https://stackoverflow.com/help/mcve http://stackoverflow.com/help/how -to-問 – e4c5

5

你可以使用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() 
相關問題