2017-11-08 1 views
1

私はArrayFieldを持つモデルを持っていますtagsと私は値の文字列としてカンマで区切って前後にシリアル化する必要があります。私は、このフィールドはtag1,tag2,tag3ようなタグの文字列として扱うことにしたいDRFはArrayFieldを文字列としてシリアル化します

models.py

from django.contrib.postgres.fields import ArrayField 

class Snippet(models.Model): 
    tags = ArrayField(models.CharField(max_length=255), default=list) 

、私はモデルsave()方法でこれを扱うことができるが、DRFは{tags: ["Expected a list of items but got type "str"."]}と不平を言っています。

serializers.py

class SnippetSerializer(serializers.ModelSerializer): 

class Meta: 
    model = Snippet 
     fields = ('tags') 

私は文字列としてこのフィールドを管理するために、DRFで何ができますか?私はリアクションをフロントエンドで使用していますが、そこで処理することができますが、クライアント側ではなくバックエンドでこれを処理する方が好きです。

答えて

2

希望のフォーマットを扱うカスタムフィールドを作成する必要があります postgres ArrayFieldの残りのフレームワークマッピングフィールドはListFieldなので、サブクラス化することができます。

from rest_framework.fields import ListField 

class StringArrayField(ListField): 
    """ 
    String representation of an array field. 
    """ 
    def to_representation(self, obj): 
     obj = super().to_representation(self, obj) 
     # convert list to string 
     return ",".join([str(element) for element in obj]) 

    def to_internal_value(self, data): 
     data = data.split(",") # convert string to list 
     return super().to_internal_value(self, data) 

あなたのシリアライザになるだろう:

class SnippetSerializer(serializers.ModelSerializer): 
    tags = StringArrayField() 

    class Meta: 
     model = Snippet 
     fields = ('tags') 

ここに書いて、残りのframekworkカスタムフィールドに関する詳細情報: http://www.django-rest-framework.org/api-guide/fields/#examples

関連する問題