Я работаю на Django 2.1.1 и Python 3.6.5 и выполняю достаточно большую операцию POST (32 000 объектов JSON). У меня есть следующее:
Модель:
class Data(models.Model):
investigation = models.ForeignKey(Investigation)
usage = models.FloatField()
sector = models.CharField(max_length=100, blank=False, default='')
cost = models.FloatField()
demand = models.FloatField()
Serializer:
class DataSerializer(serializers.ModelSerializer):
class Meta:
model = Data
fields = ('investigation', 'usage', 'sector', 'cost', 'demand')
Вид:
class DataView(generics.CreateAPIView):
def create(self, request, pk, format=None):
data_serializer = DataSerializer(data=request.data, many=True)
if data_serializer.is_valid():
data_serializer.save()
Проблемы возникают при выполнении шагов is_valid () и save (), каждый из которых запускает отдельный запрос для каждого из 32 000 объектов.
Я потратил много времени на изучение этой проблемы, и я предполагаю, что шаг is_valid () является медленным из-за проблемы запроса N + 1, так как внешний ключ ищется каждый раз (хотя я мог бы быть неправильно в этом!) но я понятия не имею, как реализовать метод prefetch_related в этой структуре.
Шаг save () (который является самой медленной частью), очевидно, должен быть выполнен в одном запросе (вероятно, bulk_create), но я не могу найти, куда добавить шаг bulk_create. Я прочитал этот вопрос но я все еще не знаю, как ответить. Я пытался создать ListSerializer, как подсказывает вопрос, но объекты все еще казались сериализованными один за другим.
Любые указатели будут с благодарностью.