在Django

时间:2018-09-07 13:59:38

标签: django django-rest-framework

我正在尝试使用Mixin to support POST of arrays在一个POST中创建许多模型实例。

我的用例将涉及在每个调用中创建1000个模型实例。由于一次创建一个模型,因此使用DRF很快就会变得很慢。

为了优化创建,我已更改为使用bulk_create()。尽管这确实带来了显着的改进,但我注意到,对于创建的每个模型实例,都在运行SELECT语句以获取ForeignKey,我跟踪到对serializer.is_valid()的调用。

这样,添加 n 个实例将导致 n 个SELECT查询以获取ForeignKey和1个INSERT查询。


例如:

模型(使用自动ID字段):

class Customer(models.Model):
    name = models.CharField(max_length=100, blank=False)
    joined = models.DateTimeField(auto_now_add=True)

class Order(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
    timestamp = models.DateTimeField()
    price = models.FloatField()

将数据发布到api/orders/

[
  {
    "customer": 13,
    ...
  },
  {
    "customer": 14,
    ...
  },
  {
    "customer": 14,
    ...
  }
]

这将导致3条SELECT语句获取每个订单的客户,然后是1条INSERT语句将数据推入。


在获取GET请求中的数据时类似于prefetch_related()的查询,有什么方法可以避免在反序列化和验证时避免执行如此多的查询(例如将序列化程序设置为预取外键)?

0 个答案:

没有答案