批量保存()多个对象 - 使用层次结构进行更新和创建

时间:2015-11-10 05:40:57

标签: python arrays json django django-rest-framework

我正在尝试在验证时从json创建对象。但是我不想直接插入或更新它们到DB中,以防JSON包含错误的格式甚至是不可接受的数字(在数组中)并尝试将所有这些对象收集到数组中并在最后保存它(代码如下)。 JSON看起来像这样

{
"id": "a1ab2759-e947-4a59-aa82-1e558f1693ca",
"puzzle_played": [[135, 136, 137],[138, 139, 140],[141,144,146]]
}

顶级是puzzle_played。该对象存在。我想要的只有一件事是更新其提交日期:

puzzle_played.submission_date = datetime.today

然后我正在阅读JSON的数组'puzzle_played'。每个整个阵列都有一组点。所以这里有一个像这样的项目层次结构(我已经只有puzzle_played,我想要创建的其余对象)

puzzle_played
    +solution_cluster
        +cluster_point
        +cluster_point
    +solution_cluster
        [...]

我正在做的是(我跳过了验证步骤)

    objects_to_save = []
    puzzle_played_id = request.data['id']

    pp = get_object_or_404(Puzzles_Played, pk = puzzle_played_id)

    pp.date_submitted = datetime.today()

    #I DO NOT save it, but put it in the array for latter 'bulk' save 
    objects_to_save.append(pp)

    puzzle_played = request.data['puzzle_played']

    counter = 0
    for _i in puzzle_played:

        sc = Solution_Cluster(puzzle_played = pp, cluster = counter)
        #I DO NOT save it, but put it in the array for latter 'bulk' save 
        objects_to_save.append(sc)
        for _j in _i:
            point = get_object_or_404(Point, pk = _j)
            cp = Cluster_Point(solution_cluster = sc, point = point)
            objects_to_save.append(cp)


    for _obj in objects_to_save:
        _obj.save()

问题是当我迭代我几乎创建的对象(objects_to_save)时 - 我有(1048, "Column 'cluster_id' cannot be null")。这发生在第一个 cluster_point 上,即我创建的第一个对象,参考创建的父对象。这意味着parental solution_cluster存在一些问题(虽然它已成功创建)。但是,当我做这样的事情时:

   for _obj in objects_to_save:
        if isinstance(_obj, Cluster_Point):
            print(_obj,_obj.solution_cluster.id)
        _obj.save()

这会为solution_cluster_id输出非null 值,这让我更加困惑! 那为什么我有这个错误?

BTW明确保存()对象后,它们的操作正常!不幸的是,这不是我想要的......

非常欢迎任何帮助!很抱歉很长的解释......

1 个答案:

答案 0 :(得分:1)

您正在分配" solution_cluster"反对" cluster_point"宾语。但问题是如果你没有为你的solution_cluster对象save()调用sc方法,它就没有ID,所以这样做

cp = Cluster_Point(solution_cluster = sc, point = point)
#lather
cp.save()

没有用。当您引用sc时,它没有ID。

  

这意味着父母解决方案集群存在一些问题(它   虽然已成功创建。

不是,它未成功创建,因为您尚未调用save()方法,因此您的sc对象存在于"内存"并且没有ID,如果没有ID,它就不能被引用为" parent"。

然后,当您开始迭代objects_to_save并保存您的第一个sc对象时,那个对象会有一个ID,然后,当您save()调用cp时} object,引用sc对象不一样,它是" copy" 没有ID(这里是棘手的部分)然后你会得到一个错误。