Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django,Python:批量创建多个依赖项_Python_Django - Fatal编程技术网

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以来一直可用。