Python - 自动创建子记录

Posted

技术标签:

【中文标题】Python - 自动创建子记录【英文标题】:Python - Automatically create child records 【发布时间】:2015-08-14 20:40:22 【问题描述】:

我需要将 mysql 表上的触发器转换为 Python/Django。

触发器将选择加载到游标中,循环并创建子记录。这里是:

DECLARE cur CURSOR FOR select id from eval_category;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
  det_loop: LOOP
    FETCH cur INTO ids;
    IF done THEN
      LEAVE det_loop;
    END IF;
    INSERT INTO eval_evaluationdetail 
    (evaluation_id, category_id) VALUES (NEW.id,ids);
  END LOOP;
CLOSE cur;

为了将其转换为 Python,我修改了 models.py 如下:

def save(self):
    super(Evaluation, self).save()
    for cat in Category.objects.all():
        self.EvaluationDetail.evaluation=self
        self.EvaluationDetail.category=cat
        self.EvaluationDetail.save()

这是最新的迭代,但它仍然不起作用:(任何帮助将不胜感激。

【问题讨论】:

但你为什么要这样做? 这是一个调度程序,所以在安排评估时,我想在详细文件(类别(1-100)中自动创建子记录(100条记录)。触发器工作正常在我的本地安装上,但托管站点不允许触发器(grrrr!)所以我需要复制触发器在 Django 中执行的过程。 啊,这让事情变得复杂了!但也许您可能需要考虑切换托管服务提供商而不是更改代码。他们可能会有更多像这样隐藏起来的惊喜。 谢谢,正是我的想法。 【参考方案1】:

首先,save_model 用于ModelAdmin,而不是Model。它不会做任何特别的事情。

您有两个选择:您可以覆盖模型上的save,或者使用post_save 信号。以下是采用这两种方法的其他答案的一些链接:

This answer 有一个使用信号的好例子,

This question 有一个很好的覆盖 save 的示例,包括讨论如何在这两个选项之间进行选择。

【讨论】:

嘿,对不起,如果我看起来很迟钝,但我并不精通 Python,而且我的触发器很简单:) 我已将其更改为:def save(self): self.save() for cat in Category.objects.all(): evdet = EvaluationDetail.objects.create(evaluation=self.id, category=cat) 现在我收到一个错误超出最大递归深度。我应该使用 super 而不是 self.save() 吗? 好的,我通读了这些,并尝试了两种错误。这是最后一次迭代:def save(self, **kwargs): super(Evaluation, self).save() if self.pk is None: for cat in Category.objects.all(): self.EvaluationDetail.evaluation=self self.EvaluationDetail.category=cat self.EvaluationDetail.save() 有什么想法吗?我不确定 self.pk,但我只希望它在插入时运行。 您使用super 是对的。至于其余的功能,在您上面的评论中,您说您正在尝试创建一堆子记录,但在这里您只是一遍又一遍地为同一记录重新分配不同的值并保存。 (我不确定 EvaluationDetail 是模型还是实例)。您的内部循环中可能需要更多类似于 EvaluationDetail.objects.create(...) 的内容。 您好,谢谢,EvaluationDetail 是一个模型class EvaluationDetail(models.Model): evaluation = models.ForeignKey(Evaluation) category = models.ForeignKey(Category) score = models.ForeignKey(Scoring) 所以而不是自我。我应该使用EvaluationDetail.objects.create(evaluation_id=self, category_id=cat)

以上是关于Python - 自动创建子记录的主要内容,如果未能解决你的问题,请参考以下文章

在 plotly 中自动创建子图(例如 R 中的 Facetting)

TDengine使用文档

为啥 Parallel::ForkManager 创建子进程很好,但不能并行处理它们

怎么使用和创建水晶报表 子报表?

Microsoft Access:在插入之前获取当前记录并创建子记录

创建问题时自动创建 JIRA 子任务