2017-07-11 61 views
2

シリアル化されたフィールドを値でソート/グループ化する方法に関する提案を探しています。 ここでは、私が達成したいことを説明するコード例を示します。Django Rest Frameworkでシリアル化されたフィールドを並べ替える方法

モデル

class Folder(models.Model): 
    name = models.CharField() 


class File(models.Model): 
    filetype = models.CharField() 
    name = models.CharField() 
    folder = models.ForeignKey(Folder) 

シリアライザ

class FileSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = File 
     fields = ('id', 'filetype', 'name') 


class FolderSerializer(serializers.ModelSerializer): 

    files = FileSerializer(read_only=True) 

    class Meta: 
     model = Folder 
     fields = ('name', 'files') 

これはにシリアライズ:私はこれにシリアライズする方法を探してい

{ 
    "name": "Test Folder", 
    "files": [ 
     {"id": 1, "filetype": "pdf", "name": "some pdf file"}. 
     {"id": 2, "filetype": "pdf", "name": "some other pdf file"}, 
     {"id": 3, "filetype": "txt", "name": "some text file"} 
    ] 
} 

{ 
    "name": "Test Folder", 
    "files": [ 
     "pdf": [ 
      {"id": 1, "name": "some pdf file"}, 
      {"id": 2, "name": "some other pdf file"} 
     ], 
     "txt": [ 
      {"id": 3, "name": "some text file"} 
     ] 
    ] 
} 

答えて

2

これにはSerializerMethodFieldを使ってみてください。あなたは次のようなものを実装する必要があります:

class FolderSerializer(serializers.ModelSerializer): 
    files = serializers.SerializerMethodField() 

    class Meta: 
     model = Folder 
     fields = ('name', 'files') 

    def get_files(self, obj): 
     result = {'pdf': [], 'txt':[]} 
     for file in obj.file_set.all(): 
      serializer = FileSerializer(file) 
      if file.name.endswith('pdf'): 
        result['pdf'].append(serializer.data) 
      if file.name.endswith('txt'): 
        result['txt'].append(serializer.data) 
     return result 
関連する問題