使用外键安全地持久化Django模型

2024-09-30 01:30:33 发布

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

我通过一个视图实现了一对多模型的存储。模型结构如下:

  • 达格伦模型
  • 许多DagRunModel,其中有一个FK到一个DagRun
  • 许多DagModelParam,其中有一个FK到一个DagRunModel

因此,我首先创建所有实例,以确保没有错误,最后使用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()

如果我决定在创建它们时保存它们,那么这段代码可以正常工作。因此,外键似乎只能在模型被持久化后使用,如果我的模型在层次结构的后面无法创建,这可能会有风险。你知道吗

有没有更安全的方法?你知道吗


Tags: runin模型fortaskmodelparammodels
2条回答

您可能需要使用transaction,这样您就可以强制执行“一切都被保存或什么都不做”类型的行为。我认为这是最安全的方法。你知道吗

除了找到简化模型之间关系的方法之外,真的没有别的方法了。你知道吗

在设置相关对象的主键之前,无法安全地建立ForeignKey关系。否则,您可能会告别数据完整性。你知道吗

如果您非常担心链中某个地方发生故障的可能性,请记住您可以访问刚刚保存的对象,并添加错误处理,在发生故障时删除整个新对象链,并抛出一个有用的错误,指出该链的故障位置。你知道吗

相关问题 更多 >

    热门问题