我通过一个视图实现了一对多模型的存储。模型结构如下:
因此,我首先创建所有实例,以确保没有错误,最后使用save()将它们持久化。但这又回来了
django.db.utils.IntegrityError: NOT NULL constraint failed:
[28/Jul/2017 11:56:12] "POST /task/run HTTP/1.1" 500 19464
这是我如何创建模型并最终保持它们的代码
def task_run(request):
dag_task = None
dag_tasks = DagTask.objects.filter(dag_id=request.POST["task"])
if len(dag_tasks) > 0:
dag_task = dag_tasks[0]
else:
raise ValueError("Task name is not a valid dag id")
dag_run = DagRun(
dag_task=dag_task,
database=request.POST["database"],
table=request.POST["table"],
label=request.POST["label"],
features=request.POST["features"],
user=request.user,
date=timezone.now()
)
dag_params = []
dag_models = []
models = json.loads(request.POST["models"])
for model in models:
dag_run_model = DagRunModel(
dag_run=dag_run,
dag_model=model["name"]
)
dag_models.append(dag_run_model)
for param in model["params"]:
dag_param = DagRunParam(
dag_run_model=dag_run_model,
dag_param=param["name"],
param_value=param["value"]
)
dag_params.append(dag_param)
dag_run.save()
for dag_model in dag_models:
dag_model.save()
for dag_param in dag_params:
dag_param.save()
如果我决定在创建它们时保存它们,那么这段代码可以正常工作。因此,外键似乎只能在模型被持久化后使用,如果我的模型在层次结构的后面无法创建,这可能会有风险。你知道吗
有没有更安全的方法?你知道吗
您可能需要使用transaction,这样您就可以强制执行“一切都被保存或什么都不做”类型的行为。我认为这是最安全的方法。你知道吗
除了找到简化模型之间关系的方法之外,真的没有别的方法了。你知道吗
在设置相关对象的主键之前,无法安全地建立
ForeignKey
关系。否则,您可能会告别数据完整性。你知道吗如果您非常担心链中某个地方发生故障的可能性,请记住您可以访问刚刚保存的对象,并添加错误处理,在发生故障时删除整个新对象链,并抛出一个有用的错误,指出该链的故障位置。你知道吗
相关问题 更多 >
编程相关推荐