Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.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 如何在保存django模型时避免递归_Python_Django_Django Models - Fatal编程技术网

Python 如何在保存django模型时避免递归

Python 如何在保存django模型时避免递归,python,django,django-models,Python,Django,Django Models,我有一个模型条目 现在,无论何时为任何日期创建条目。然后在保存之前,我需要进行检查并添加更多条目,例如 条目1-红色 现在假设如果有任何entry.color=red,那么我还需要创建两个类似的条目 Entry 2 - red2 Entry 3 - red3 现在我把它放在了预存信号中 @receiver(pre_save, sender=Entry) def new_entries(sender, instance, *args, **kwargs): pass 现在我的问题是,

我有一个模型
条目

现在,无论何时为任何日期创建
条目
。然后在保存之前,我需要进行检查并添加更多条目,例如

条目1-红色

现在假设如果有任何
entry.color=red
,那么我还需要创建两个类似的条目

Entry 2 - red2
Entry 3 - red3
现在我把它放在了预存信号中

@receiver(pre_save, sender=Entry)
def new_entries(sender, instance, *args, **kwargs):
     pass
现在我的问题是,这个循环以无限递归结束,因为我要保存的新条目也会发送pre_save信号,这个循环永远不会结束


你把这个逻辑放在哪里,这样递归就不会发生?

我认为你应该有两个独立的模型来实现这一点。您的“父项”
Entry
可以是主
Entry
模型的子类,因此只有它才能创建新的子项

class Entry(models.Model):
    pass
    # whatever you need here

class ParentEntry(Entry):

    @receiver(pre_save, sender=ParentEntry)
    def new_entries(sender, instance, *args, **kwargs):
        pass

添加另一个模型的原因是,这些模型实际上做了2件不同的事情,1在创建时创建更多,1不创建。为清楚起见,我将防止出现一个模型的构造函数可以做两件独立的事情的情况。

类似的方法应该可以工作:

class Entry(model.Model):

   def save(self, color, create_more=True, *args, **kwargs):
       if self.pk is None:  # this is a new Entry              
           if create_more:
               new_color = '%s2' % color
               Entry(color=new_color, create_more=False).save()

       super(Entry, self).save(...)

虽然我怀疑有更好的方法,但如果不知道您正在尝试执行的操作的更多细节,我就不能这么说。

我将使用另一个要保存的参数来解决它,而不是附加到pre_save:

import django.db.models
class Entry(models.Model):
    color=models.CharField(max_length="50")
    def save(self,create_children=True,**kwargs):
        if create_children and not self.pk:
            result = super(Entry,self).save(**kwargs)
            Entry(color=self.color).save(create_children=False)
            Entry(color=self.color).save(create_children=False)
        else:
            result = super(Entry,self).save(**kwargs)
        return result

您要确保在实际构造子对象之前调用
super(Entry,self).save(**kwargs)
,否则,当super()在django中的post_save singal中引发
IntegrityError时,您将用模型扰乱数据库,以避免需要进行递归“if created”检查

from django.dispatch import receiver
from django.db.models.signals import post_save
@receiver(post_save, sender=DemoModel)
def _post_save_receiver(sender,instance,created, **kwargs):
if created:            
    print('hi..')
    instance.save()

你到底想做什么?@基本上,如果新条目与前一条在时间上重叠,我需要拆分条目。你需要在同一个模型中创建新条目吗?是否需要在创建该模型的新记录之前创建它们?请提供更多信息details@chaos是的,是同一型号的。我需要创建条目,我也可以在之后创建条目,然后发送一个附加参数,该参数将说明是否存在依赖项。如果您有依赖项,请在不中断的情况下创建它们。对于依赖项,不发送该参数。如果我正确理解您的问题,请小心传递给保存的内容。此实现需要调用实例化,如:
Entry(color=“blue”).save(“blue”)
,请参阅我的答案以了解如何避免此问题。由于我使用django rest serializer进行保存,我是否需要在保存结束时返回一些内容?如果只是关于添加行为,然后你可能想考虑一个<代码>代理>代码>模型,但我不知道它们是如何与信号交互的…