私のアプリケーションでDjango Rest Frameworkを使用しています。私は外部キーを含む新しいモデルインスタンスを作成する必要があります。これらは別のテーブルの既存のオブジェクトを参照するので、これらの異物の新しいインスタンスを作成することは望ましくありません。また、その情報が提出されていないので、主キーを介してこれらのオブジェクトにアクセスすることはできません(がである特定のフィールドをフィルタリングする必要があります)。Django REST Frameworkシリアライザ - 既存の外部キーへのアクセス
どうすればよいですか? This質問は同じ問題に対処しているようですが、受け入れられた答えが実際に問題を解決することは明らかではありません。カテゴリを指定し、後者でForeignKey
フィールドで、Iは、2つのモデル、Category
とItem
があると:
class Category(models.Model):
name = models.TextField()
format = models.TextField()
page = models.IntegerField(default=1)
order = models.IntegerField(default=1)
class Item(models.Model):
username = models.TextField()
title = models.TextField()
category = models.ForeignKey('Category', null=True)
data = JSONField(null=True, blank=True)
POST
リクエストのボディフォーマットを指定するオブジェクトとして定義されたカテゴリと、JSONペイロードから構成され、ページとオーダーフィールド:
POST /api/items
{
"username" : "test",
"title" : "foo",
"category" : {
"format" : "A",
"page" : 2,
"order" : 1
},
"data" : [1,2,3,4,5]
}
それから私は、それが適切なフィールドにフィルタリングすることによって、右Category
インスタンスを取得するようcreate
をオーバーライドし、次のように私は私のItem
シリアライザを定義できます仮定します返されたItem
インスタンスに設定します。
class ItemSerializer(serializers.ModelSerializer):
category = CategorySerializer()
data = serializers.ListField()
class Meta:
model = Item
fields = ('username', 'title', 'category', 'data')
def create(self, validated_data):
category_dict = validated_data.pop('category')
item = Item.objects.create(**validated_data)
format = category_dict.format
page = category_dict.page
order = category_dict.order
item.category = Category.objects.get(format=format, page=page, order=order)
return item
これは正しい方法ですか?
はい、正しい方法です。名前を付ける必要があります。したがって、カテゴリにこれらの詳細が存在しない場合は、新しいカテゴリも作成できます。あなたがすでに利用可能な正しいカテゴリを与えていると確信している場合は、それを行う正しい方法です。 –