我使用的是multi-table inheritance模型。
from django.db import models
class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
class Restaurant(Place):
serves_hot_dogs = models.BooleanField(default=False)
serves_pizza = models.BooleanField(default=False)
class Cinema(Place):
sells_tickets = models.BooleanField(default=False)
sells_popcorn = models.BooleanField(default=False)
class Coffee(Place):
sells_tea = models.BooleanField(default=False)我有一个视图,可以创建几个不同的模型:
items = [
Restaurant(...),
Restaurant(...),
Restaurant(...),
Cinema(...),
Cinema(...),
Coffee(...),
Coffee(...),
# + 1.000 other items
]
for item in items:
item.save()显然,这是非常低效的,因为它创建了大量的查询。不幸的是,Django还没有提供用于多表继承的批量创建方法(有一个用于它的open pull request )。优化这段代码的最好方法是什么?我是否必须编写原始SQL查询,或者是否有其他方法?
发布于 2020-12-24 15:56:25
我通过检查bulk_create的实现解决了这个问题。在底层,它使用InsertQuery类来生成SQL INSERT INTO语句。与编写原始SQL查询相比,这要简洁得多。
# Create all concrete models at once
items = Place.objects.bulk_create(items)
# Group items by their model
item_mapping = defaultdict(list)
for item in items:
item_mapping[type(item)].append(item)
# Create a bulk insert for each model
for model, items in item_mapping.items():
fields = model._meta.local_concrete_fields
query = sql.InsertQuery(model)
query.insert_values(fields, items)
query.get_compiler(connection=connection).execute_sql()https://stackoverflow.com/questions/65420783
复制相似问题