我正在尝试使用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()
的查询,有什么方法可以避免在反序列化和验证时避免执行如此多的查询(例如将序列化程序设置为预取外键)?