1. ホーム
  2. python

[解決済み] DRF: ネストされたシリアライザーによる単純な外部キー割り当て?

2023-01-31 04:06:31

質問

Django REST Framework では、標準的な ModelSerializer は、ID を整数値で POST することで ForeignKey モデル関係を割り当てたり変更したりすることができます。

はどうなっているかというと 最もシンプルな というのは、ネストされたシリアライザからこの動作を得るにはどうしたらよいでしょうか?

注意:私は既存のデータベースオブジェクトの割り当てについてだけ話しています。 ではなく ネストされた作成ではありません。

私は過去にシリアライザーに 'id' フィールドを追加してこれを回避し、カスタム createupdate メソッドを使用していますが、これは私にとって一見単純で頻繁に発生する問題なので、最良の方法を知りたいと思っています。

class Child(models.Model):
    name = CharField(max_length=20)

class Parent(models.Model):
    name = CharField(max_length=20)
    phone_number = models.ForeignKey(PhoneNumber)
    child = models.ForeignKey(Child)

class ChildSerializer(ModelSerializer):
    class Meta:
        model = Child

class ParentSerializer(ModelSerializer):
    # phone_number relation is automatic and will accept ID integers
    children = ChildSerializer() # this one will not

    class Meta:
        model = Parent

どのように解決するのですか?

最良の解決策は、読み込み用と書き込み用の2つのフィールドを使用することです。いくつかの 重い を行わないと、探しているものを得ることは困難です。 を単一のフィールドで .

読み取り専用のフィールドは、ネストしたシリアライザー( ChildSerializer この場合) で、期待するのと同じネストされた表現を得ることができるようになります。ほとんどの人はこれを単に child と定義します。なぜなら、この時点ですでにフロントエンドが書かれており、それを変更すると問題が生じるからです。

書き込み専用のフィールドは PrimaryKeyRelatedField で、これは通常、主キーに基づいたオブジェクトの割り当てに使用されるものです。 これは書き込み専用である必要はありません。特に、受信するものと送信するものの間に対称性を持たせようとしている場合は、それが最も適しているように聞こえます。このフィールドには a source を外部キーフィールドに設定します ( child に設定されているため、作成時や更新時に適切に割り当てられます。


これはディスカッション グループで何度か取り上げられましたが、やはりこれが最良の解決策だと思います。感謝 Sven Maurer の指摘に感謝します。 .