Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-自动创建子记录_Python_Mysql_Django_Parent Child - Fatal编程技术网

Python-自动创建子记录

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

我需要将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 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中的触发器的过程。啊,这使得它很复杂。但是也许你可能想考虑切换主机提供商,而不是改变代码。他们可能会有更多这样的惊喜被隐藏起来。谢谢,我的想法。