ジャンゴ休止フレームワーク3.0およびこれらの単純なモデルを持ちます:
class Book(models.Model):
title = models.CharField(max_length=50)
class Page(models.Model):
book = models.ForeignKey(Books, related_name='related_book')
text = models.CharField(max_length=500)
そして、このJSONリクエストを与えられます:
{
"book_id":1,
"pages":[
{
"page_id":2,
"text":"loremipsum"
},
{
"page_id":4,
"text":"loremipsum"
}
]
}
ネストされたシリアライザを記述してこのJSONを処理し、指定されたJSONごとpage
にbook
新しいページを作成するか、存在する場合は更新する方法を教えてください。
class RequestSerializer(serializers.Serializer):
book_id = serializers.IntegerField()
page = PageSerializer(many=True)
class PageSerializer(serializers.ModelSerializer):
class Meta:
model = Page
シリアライザをでインスタンス化するinstance
と現在のシリアライザが更新されることはわかっていますが、create
ネストされたシリアライザのメソッド内でそれをどのように使用すればよいですか?
まず、新しいブックインスタンスの作成をサポートしますか、それとも既存のインスタンスの更新のみをサポートしますか?
新しい本のインスタンスを作成したいだけの場合は、次のようなことができます...
class PageSerializer(serializers.Serializer):
text = serializers.CharField(max_length=500)
class BookSerializer(serializers.Serializer):
page = PageSerializer(many=True)
title = serializers.CharField(max_length=50)
def create(self, validated_data):
# Create the book instance
book = Book.objects.create(title=validated_data['title'])
# Create or update each page instance
for item in validated_data['pages']:
page = Page(id=item['page_id'], text=item['text'], book=book)
page.save()
return book
ここには含まれていませんbook_id
。本のインスタンスを作成するときは、本のIDは含めません。書籍のインスタンスを更新する場合、通常はリクエストデータではなく、URLの一部として書籍IDを含めます。
書籍インスタンスの作成と更新の両方をサポートする場合は、リクエストに含まれていないが、現在書籍インスタンスに関連付けられているページの処理方法を検討する必要があります。
これらのページを黙って無視してそのままにしておくか、検証エラーを発生させるか、または削除するかを選択できます。
リクエストに含まれていないページを削除したいとします。
def create(self, validated_data):
# As before.
...
def update(self, instance, validated_data):
# Update the book instance
instance.title = validated_data['title']
instance.save()
# Delete any pages not included in the request
page_ids = [item['page_id'] for item in validated_data['pages']]
for page in instance.books:
if page.id not in page_ids:
page.delete()
# Create or update page instances that are in the request
for item in validated_data['pages']:
page = Page(id=item['page_id'], text=item['text'], book=instance)
page.save()
return instance
また、本の更新のみをサポートし、作成はサポートしないこともできます。その場合、メソッドのみを含めますupdate()
。
クエリの数を減らすことができるさまざまな方法もあります。一括作成/削除を使用しますが、上記はかなり簡単な方法で仕事をします。
ご覧のように、ネストされたデータを処理するときに必要になる可能性のある動作のタイプには微妙な点があるため、さまざまなケースで予想される動作を正確に慎重に検討してください。
Serializer
上記の例では、ではなくを使用していることにも注意してくださいModelSerializer
。この場合ModelSerializer
、デフォルトで生成されるフィールドの自動セットに依存するのではなく、シリアライザクラスにすべてのフィールドを明示的に含めるだけの方が簡単です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加