2016-05-12 4 views
2

私はCharFieldと主キーとしてidをオーバーライドしたモデルを持っています。ここでは、モデルとそのシリアライザです:Django RESTフレームワーク:POST時にIdフィールドを作成する方法、つまり非読み取り専用フィールドですか?

class Tool(models.Model): 
    id = models.CharField(max_length=10000, primary_key=True, default=uuid.uuid4, editable=False) 
    description = models.TextField(null=True, blank=True) 
    ... 

class ToolSerializer(serializers.HyperlinkedModelSerializer): 

    class Meta: 
     model = Tool 
     fields = (
      'id', 
      'description', 
      ... 
     ) 

デフォルトでは、DjangoのRESTフレームワークは、読み取り専用としてidフィールドをマークし、POSTリクエスト時に、それを必要としません。しかし、私はそれが書き込み可能でPOSTの時にそれを必要としたい。どのように達成するのですか?

+0

ただの好奇心が、なぜあなたはそれを必要としますか? –

答えて

3

私が思うに、私はDRFのドキュメントの予期せぬ場所で答えを見つけた:

http://www.django-rest-framework.org/api-guide/serializers/#customizing-multiple-update

私はこのようなシリアライザに明示的なidフィールドを作成する必要があります。

class ToolSerializer(serializers.HyperlinkedModelSerializer): 
    id = serializers.CharField() 

    class Meta: 
     model = Tool 
     fields = (
      'id', 
      'description', 
      ... 
     ) 

この意志読み取り専用として作成されたデフォルトのidフィールドをオーバーライドします。

+0

は動作しますか?それは本当にデータベースのpkフィールドを更新しますか? –

+0

はい、間違いなくGET、POST、DELETEリクエストで動作し、現在PUTをデバッグしています。私はそうすることを決めました。ツール名は一意ではなく、誰もが自分の名前を表示することができます(したがって、URLにツール名を使用します)。なぜ名前をプライマリIDとして使用しないのですか?その場合、POSTの際にはツールの 'id'を指定する必要がありますので、' id'フィールドを非読み取り専用にしなければなりませんでした。 –

+1

@KarinaKlinkevičiūtėは、書き込み可能な 'id'フィールドを作成する別の理由に直面しました:ListSerializersでの更新の実装:http://www.django-rest-framework.org/api-guide/serializers/#customizing-multiple-update –

関連する問題