Многократное обновление DRF с уменьшением количества обращений к базе данных

Я использую пример DRF с множественными обновлениями, который работает нормально, за исключением того, что каждое self.child.update является отдельным запросом на обновление базы данных.

Есть ли способ переписать это, чтобы вызывать обновления одним запросом как массовое обновление?

class BookListSerializer(serializers.ListSerializer):
    def update(self, instance, validated_data):
        book_mapping = {book.id: book for book in instance}
        data_mapping = {item['id']: item for item in validated_data}

        ret = []
        for book_id, data in data_mapping.items():
            book = book_mapping.get(book_id, None)
            ret.append(self.child.update(book, data))

        return ret

class BookSerializer(serializers.Serializer):
    id = serializers.IntegerField()

    class Meta:
        list_serializer_class = BookListSerializer

В Django есть команда bulk_update
Docs: https://docs.djangoproject.com/en/4.1/ref/models/querysets/#bulk-update

Я бы написал полный пример, но я не уверен, как выглядит validated_data

A few suggestions:

 - Use ModelSerializer, as mentioned. It will handle updates/creates automatically and more efficiently.
 - Use model validation (clean methods) instead of serializer validation for database-level validation.
 - Use bulk_create for the creation case (instead of a loop).
 - Use select_related/prefetch_related to reduce queries when fetching the instance.
 - Use .update() or F-expressions to update fields, instead of re-getting the instance from the DB.
 - Use partial=True on the serializer if you expect partial updates.
Вернуться на верх