Django,Python:批量创建多个依赖项

2024-10-03 13:25:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有很多依赖项(Group->Link->Match),如果没有ForeignKey的id,我就无法创建一个新的one对象。你知道吗

有什么方法可以简化或加速这个操作? 我可以创建一个保存所需依赖项的大对象吗?我试着通过bulk_create来实现这一点,但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)

Tags: nameinforgetifobjectsmatchcreate
1条回答
网友
1楼 · 发布于 2024-10-03 13:25:23

根据每个级别有多少元素,这可能会提供一些加速:

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_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)

现在你真的在为每个级别使用一个bulk\u create。你知道吗

相关问题 更多 >