10

Django RESTフレームワーク(2.1.16)では、null可能なFKフィールドtypeを持つモデルがありますが、POST作成要求は、フィールドが必須であることを示す400 bad requestを与えます。Django RESTフレームワークのNullable ForeignKeyフィールド

私のモデルは

class Product(Model): 
    barcode = models.CharField(max_length=13) 
    type = models.ForeignKey(ProdType, null=True, blank=True) 

で、シリアライザは、次のとおりです。

class ProductSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Product 
     exclude = ('id') 

私は

class ProductSerializer(serializers.ModelSerializer): 
    type = serializers.PrimaryKeyRelatedField(null=True, source='type') 
    class Meta: 
     model = Product 
     exclude = ('id') 

ようシリアライザに明示的typeを追加しようとしました、それは効果がありません。

投稿者http://django-rest-framework.org/topics/release-notes.html#21x-seriesバグがありましたが、2.1.7で修正されました。

FKフィールドを適切に処理するためにシリアライザを変更する必要がありますか?

ありがとうございます!


UPDATE:どちらの場合も

>>> serializer = ProductSerializer(data={'barcode': 'foo'}) 
>>> print serializer.is_valid() 
False 
>>> print serializer.errors 
{'type': [u'This field is required.']} 
>>> serializer.fields['type'] 
<rest_framework.relations.PrimaryKeyRelatedField object at 0x22a6cd0> 
>>> print serializer.errors 
{'type': [u'This field is required.']} 

それは私は

>>> serializer.fields['type'].null 
True 
>>> serializer.fields['type'].__dict__ 
{'read_only': False, ..., 'parent': <prodcomp.serializers.ProductSerializer object at 0x22a68d0>, ...'_queryset': <mptt.managers.TreeManager object at 0x21bd1d0>, 'required': True, 
+0

が、これはあなたの問題に関連していると思いませんを参照してください(私は自分でそれを発見した後そのコメントを読んでからです。私にいくつかの時間をコスト)が、欠けているものを 'exclude'オプションのように見えますカンマは、それらがタプルとして扱われるようにします。 'exclude =( 'id'、)' –

+0

'source = 'type''は必要ないことに注意してください。この場合、フィールド名はすでに使用したいソースと一致しています。 –

+0

@TomChristieはい、私は最初に 'source = 'type''なしで試しました –

答えて

5

を与える: それは

>>> serializer = ProductSerializer(data={'barcode': 'foo', 'type': None}) 
>>> print serializer.is_valid() 
True 
>>> 
>>> print serializer.errors 
{} 

を与えるが、タイプ=なしなしシェルから何が起こっているのか分からないそこに、私たちはそのケースのカバレッジを持っており、同様のケースは私のためにうまく動作します。

おそらく、シェルに落としてシリアライザを直接調べてみてください。

たとえば、シリアライザをインスタンス化すると、serializer.fieldsは何を返しますか? serializer.field['type'].nullはどうですか?シリアライザに直接データを渡すと、どのような結果が得られますか?例えば

serializer = ProductSerializer(data={'barcode': 'foo', 'type': None}) 
print serializer.is_valid() 
print serializer.errors 

あなたがそれらにいくつかの答えを得る場合は、質問を更新し、我々はそれがソート得ることができる場合、我々が表示されます。より良いものを説明し

編集

オーケー、。 'type'フィールドはnullableなので、それはNoneかもしれませんが、それでも必須フィールドです。 nullにしたい場合は、明示的にそれをNoneに設定する必要があります。

実際にデータをPOSTするときにフィールドを除外したい場合は、required=Falseフラグをシリアライザフィールドに含めることができます。

+1

ありがとう、私は質問をシェルからの出力で更新しました。 –

+1

シリアライザに 'type = serializers.PrimaryKeyRelatedField(required = False)'を追加していただきありがとうございます。 (思考 'null = True'は同じことを意味します) –

+4

誰かがフィールドをnullにして検索していて、このスレッドにも遭遇した場合:フィールドにPrimaryKeyRelatedFieldのnullableを明示的に有効にする場合は、allow_null = True :) – gabn88

6

シリアライザを初期化するときkwarg allow_nullを追加します。

class ProductSerializer(serializers.ModelSerializer): 
    type = serializers.PrimaryKeyRelatedField(null=True, source='type', allow_null=True) 

は、すでに述べたように、@ gabn88のコメントで述べたが、私はそれは、独自の答えを正当だと思います。

http://www.django-rest-framework.org/api-guide/relations/

関連する問題