Django,Python:批量创建多个依赖项
我有很多依赖项(Django,Python:批量创建多个依赖项,python,django,Python,Django,我有很多依赖项(Group->Link->Match)-如果没有ForeignKey的id,我无法创建一个新的对象 有什么方法可以简化或加速此操作? 我可以创建一个保存所需依赖项的大型对象吗?我试图通过批量创建-但id存在同样的问题 groups = template.get('groups') allMatchObjs = [] if groups: for group in groups: groupObj = Group.ob
Group->Link->Match
)-如果没有ForeignKey
的id,我无法创建一个新的对象
有什么方法可以简化或加速此操作?
我可以创建一个保存所需依赖项的大型对象吗?我试图通过批量创建-但id存在同样的问题
groups = template.get('groups')
allMatchObjs = []
if groups:
for group in groups:
groupObj = Group.objects.create(name=group['name'])
links = group.get('links')
if links:
for link in links:
linkObj = Link.objects.create(
group=groupObj,
name=link['name']
matches = link.get('matches')
if matches:
matchObjs = (Match(
name=match['name'],
link=linkObj) for match in matches)
allMatchObjs.extend(matchObjs)
Match.objects.bulk_create(allMatchObjs)
根据每个级别的元素数量,这可能会提供一些加速:
groups = template.get('groups')
allMatchObjs = []
if groups:
group_models = [
Group(name=group['name']
for group in groups
]
Group.objects.bulk_create(new_groups)
for g, g_model in zip(groups, group_models):
links = g.get('links')
if links:
link_models = [
Link(group=g_model, name=link['name'])
for link in links
]
Link.objects.bulk_create(link_models)
for l, l_model in zip(links, link_models)
matches = link.get('matches')
if matches:
matchObjs = [
Match(name=match['name'], link=l_model)
for match in matches
]
allMatchObjs.extend(matchObjs)
Match.objects.bulk_create(allMatchObjs)
因此,您将在每个级别上使用bulk\u create
,尽管中间级别不在单个批次中
更新
更好的是:
groups = template.get('groups')
if groups:
allGroups = [
Group(name=group['name']
for group in groups
]
Group.objects.bulk_create(allGroups)
allLinks = []
zipped_links = []
for g, g_model in zip(groups, allGroups):
links = g.get('links')
if links:
link_objs = [
Link(group=g_model, name=link['name'])
for link in links
]
allLinks.extend(link_objs)
zipped_links.extend(zip(links, link_objs))
Link.objects.bulk_create(allLinks)
allMatchObjs = []
for link, l_model in zipped_links:
matches = link.get('matches')
if matches:
matchObjs = [
Match(name=match['name'], link=l_model)
for match in matches
]
allMatchObjs.extend(matchObjs)
Match.objects.bulk_create(allMatchObjs)
现在,您实际上是在为每个级别使用一个批量创建。在所有组中,没有具有id@Lola这可能取决于您的数据库。至少使用PostgreSQL和Django 2.0,bulk\u create
将把ID填充回所有组中。请参阅此更改日志:这意味着此功能自Django 1.10以来一直可用。