我是一个有用的助手,可以为您翻译文本。
我正在使用Django 2.1.1和Python 3.6.5,并执行一个相当大的POST操作(32,000个JSON对象)。我有以下内容:
模型:
问题出现在is_valid()和save()步骤中,每个步骤都会为32,000个对象触发单独的查询。
我花了很长时间来研究这个问题,猜测is_valid()步骤因为每次查找外键(虽然我可能错了!)而变慢,这是由于N+1查询问题导致的。但我不知道如何在这个框架中实现prefetch_related方法。
显然,最慢的部分——save()步骤需要通过一个查询完成(可能是bulk_create),但我找不到添加bulk_create步骤的位置。我阅读了this question,但从答案中仍然没有得到答案。我尝试创建一个ListSerializer,如问题所建议的那样,但似乎仍然是逐个序列化对象。任何指针将不胜感激。
我正在使用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()
序列化器:
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步骤的位置。我阅读了this question,但从答案中仍然没有得到答案。我尝试创建一个ListSerializer,如问题所建议的那样,但似乎仍然是逐个序列化对象。任何指针将不胜感激。
many = True
的另一种方式。 - Tom