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)
为啥 Parallel::ForkManager 创建子进程很好,但不能并行处理它们