Python-自动创建子记录
我需要将MySQL表上的触发器转换为Python/Django 触发器将select加载到光标中,循环并创建子记录。这是:Python-自动创建子记录,python,mysql,django,parent-child,Python,Mysql,Django,Parent Child,我需要将MySQL表上的触发器转换为Python/Django 触发器将select加载到光标中,循环并创建子记录。这是: 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 de
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()
这是最新的迭代,但仍然不起作用:(非常感谢任何帮助。首先,
save\u model
用于ModelAdmin
,而不是model
。它不会做任何特殊的事情
您有两个选项:您可以在模型上覆盖保存
,或使用后期保存
信号。以下是采用这两种方法的其他答案的链接:
有一个使用信号的好例子
有一个覆盖
save
的好例子,包括讨论如何在这两个选项之间进行选择。首先,save\u model
用于ModelAdmin
,而不是model
。它不会做任何特殊的事情
您有两个选项:您可以在模型上覆盖保存
,或使用后期保存
信号。以下是采用这两种方法的其他答案的链接:
有一个使用信号的好例子
有一个覆盖
save
的好例子,包括讨论如何在这两个选项之间进行选择。嘿,如果我看起来很迟钝,很抱歉,但我对Python不太精通,我的触发器非常简单:)我将其更改为:def save(self):self.save(),用于Category.objects.all()中的cat:evdet=EvaluationDetail.objects.create(evaluation=self.id,category=cat)
现在我发现一个错误,超过了最大递归深度。我是否应该使用super而不是self.save()?好的,我通读了这些,并尝试了两种方法,但出现了各种错误。这是最后一次迭代:def save(self,**kwargs):super(Evaluation,self).save()如果self.pk为None:Category in Category.objects.all():self.EvaluationDetail.Evaluation=self.EvaluationDetail.Category=cat self.EvaluationDetail.save()
有什么想法吗?我不确定self.pk,但我只希望它在insert上运行。您使用super
是正确的。至于函数的其余部分,您在上面的评论中说您正在尝试创建一组子记录,但这里您只是一遍又一遍地为同一记录重新分配不同的值并保存。(我不确定EvaluationDetail是模型还是实例)。您可能需要更像EvaluationDetail.objects.create(…)
的内部循环。您好,谢谢,EvaluationDetail是一个模型class EvaluationDetail(models.model):evaluation=models.ForeignKey(evaluation)category=models.ForeignKey(category)score=models.ForeignKey(score)
So,而不是自我。我应该使用EvaluationDetail.objects.create(evaluation\u id=self,category\u id=cat)
Hey,如果我看起来很迟钝,很抱歉,但我对Python不太精通,我的触发器非常简单:)我将它改为:def save(self):self.save(),用于category.objects.all()中的cat:evdet=EvaluationDetail.objects.create(evaluation=self.id,category=cat)
现在我发现一个错误,超过了最大递归深度。我是否应该使用super而不是self.save()?好的,我通读了这些,并尝试了两种方法,但出现了各种错误。这是最后一次迭代:def save(self,**kwargs):super(Evaluation,self).save()如果self.pk为None:Category in Category.objects.all():self.EvaluationDetail.Evaluation=self.EvaluationDetail.Category=cat self.EvaluationDetail.save()
有什么想法吗?我不确定self.pk,但我只希望它在insert上运行。您使用super
是正确的。至于函数的其余部分,您在上面的评论中说您正在尝试创建一组子记录,但这里您只是一遍又一遍地为同一记录重新分配不同的值并保存。(我不确定EvaluationDetail是模型还是实例)。您可能需要更像EvaluationDetail.objects.create(…)
的内部循环。您好,谢谢,EvaluationDetail是一个模型class EvaluationDetail(models.model):evaluation=models.ForeignKey(evaluation)category=models.ForeignKey(category)score=models.ForeignKey(score)
So,而不是自我。我应该使用EvaluationDetail.objects.create(evaluation\u id=self,category\u id=cat)
但是为什么要这样做呢?这是一个计划程序,所以在计划评估时,我想在详细信息文件(类别(1-100))中自动创建子记录(100条记录)。触发器在我的本地安装上运行良好,但宿主站点不允许使用触发器(grrrr!)所以我需要复制Django中触发器所做的过程。啊,这使得它很复杂。但是也许你应该考虑切换主机提供程序而不是改变代码。它们可能会隐藏更多的惊喜。谢谢,我的想法是正确的。但是你为什么要这么做?这是一个日程安排程序。评估已安排,我想在详细信息文件(类别(1-100))中自动创建子记录(100条记录)。触发器在我的本地安装中运行良好,但托管站点不允许使用触发器(grrrr!)所以我需要复制Django中的触发器的过程。啊,这使得它很复杂。但是也许你可能想考虑切换主机提供商,而不是改变代码。他们可能会有更多这样的惊喜被隐藏起来。谢谢,我的想法。