2015-10-07 7 views
6

をシリアル化するとき、ヌルフィールドを省略します:DjangoRestFrameworkこれは私のモデルであるオブジェクト

class Post(models.Model): 
    user = models.ForeignKey(User) 
    post = models.CharField(max_length=400) 
    country = models.ForeignKey(Country, blank=True, null=True) 

、これが私のシリアライザです:私はDRFを伝えるためにのためにどのような方法があります

class PostSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Post 
     fields = ('user', 'post', 'country',) 

    def create(self, validated_data): 
     post = Post(
       user = User.objects.get(username='MyUser'), 
       post = validated_data['post'], 
     ) 

     if validated_data.get('country', None): 
      post.country = validated_data['country'] 

     return post 

その値の場合フィールドはnullです( 'country'フィールドはオプションで、時には提供されないため)、スキップして他のデータをシリアル化しますか?または少なくともNoneの値でシリアル化しますか?

'country'フィールドは読み取り専用フィールドではないため、SerializerMethodField(http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield)を使用することはできません。

基本的には、オブジェクトをシリアル化するときにフィールドを省略したい(または少なくとも値Noneを作成する)フィールドがnullの場合。

答えて

3

DRF 3.2.4の時点では、限り、あなたがモデルのフィールドに

blank=True 

を追加します

class Post(models.Model): 
    country = models.ForeignKey(Country, blank=True) 

その後、DRFがモデルフィールド上の真のヌルが=存在しない場合は、Sしようとすると、Djangoはエラーが発生しますことにかかわらず、注意してください(それをシリアライズおよびデシリアライズするときなどのオプションフィールドを扱います。そうのようなフィールドを提供せずにオブジェクトをデータベースに送ります)。

は、より多くの情報のためにここに答えを参照してください:DjangoRestFramework - correct way to add "required = false" to a ModelSerializer field?

あなたは事前DRF 3.2.4を使用している場合は、そのシリアライザのフィールドをオーバーライドして、=それにFalseを必要と追加することができます。 explicitilyフィールドを指定するか、上書きする方法の詳細については、こちらのドキュメントを参照してください:http://www.django-rest-framework.org/api-guide/serializers/#specifying-fields-explicitly

したがって、このような何か(私は完全に以下のコードをテストしていないが、それはこれらの線に沿って何かでなければならないことに注意してください):

class PostSerializer(serializers.ModelSerializer): 
    country = serializers.PrimaryKeyRelatedField(required=False) 
    class Meta: 
     model = Post 
     fields = ('user', 'post', 'country',) 
2

このスレッドは役に立つかもしれません:

https://stackoverflow.com/a/28870066/4698253

それは基本的にあなたが若干の修正とto_representation()関数をオーバーライドできることを言います。

私はコメントでこれを入れているだろうが、私はまだ十分なポイントを持っていない:(

関連する問題