首页 > 解决方案 > 使用多表继承模型批量创建

问题描述

我正在使用多表继承模型。

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 还没有为多表继承提供批量创建方法(有一个开放的拉取请求)。优化此代码的最佳方法是什么?我必须编写原始 SQL 查询还是有其他方法?

标签: pythondjango

解决方案


我通过检查bulk_create. 它的底层使用InsertQuery类来生成 SQLINSERT 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()

推荐阅读