我正在尝试在验证时从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明确保存()对象后,它们的操作正常!不幸的是,这不是我想要的......
非常欢迎任何帮助!很抱歉很长的解释......
答案 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(这里是棘手的部分)然后你会得到一个错误。