python - 使用多表继承模型批量创建
问题描述
我正在使用多表继承模型。
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 查询还是有其他方法?
解决方案
我通过检查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()
推荐阅读
- python - How can I name the second row of the first column in a multi-index data frame? It is blank now
- ios - Flutter iOS 蓝牙权限
- java - 如何通过 libvlcjni 从视频创建快照?
- qt - 使用 Qt 进行双向 SSL 身份验证
- laravel - array.some 不是 My Laravel Vue Js 项目中的函数
- pandas - 重复排序到 CSV 列出所有重复的引用 pandas
- html - 如果缓慢扩展站点,Vuetify Grid System Breakpoints 不起作用
- html - 如何使用html在表格单元格中使用列表项。?
- spring-security - UI5 - 带有 http 标头参数的路由
- c++ - cocos2d-x 中的相同代码会产生不同的图形输出。为什么会发生这种情况以及如何纠正它?