21

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

私のモデルは

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')

type次のようにシリアライザーに明示的に追加しようとしました

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

そしてそれは効果がありません。

http://django-rest-framework.org/topics/release-notes.html#21x-seriesから、バグがあったことがわかりますが、2.1.7 で修正されました。

FK フィールドを適切に処理するには、シリアライザーをどのように変更すればよいですか?

ありがとう!


更新:それが与えるシェルから

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

ただし、type=None なし:

>>> 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, 
4

2 に答える 2

17

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

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

@ gabn88 のコメントで既に述べたように、独自の回答が必要だと思います。(自分で見つけてからコメントを読んだだけなので、少し時間がかかりました。)

http://www.django-rest-framework.org/api-guide/relations/を参照してください。

于 2015-08-04T17:23:31.697 に答える
8

そこで何が起こっているのかわかりません。そのケースのカバレッジがあり、同様のケースが問題なく機能します。

おそらく、シェルにドロップして、シリアライザーを直接検査してみてください。

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

例えば:

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

それらに対する回答が得られた場合は、質問を更新してください。並べ替えることができるかどうかを確認します。

編集

さて、それは物事をよりよく説明します。'type'フィールドはnull許容であるため、null可能である可能性がありますがNone、それでも必須フィールドです。nullにしたい場合は、明示的にに設定する必要がありますNone

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

于 2013-01-17T16:13:32.013 に答える