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进行保存,我是否需要在保存结束时返回一些内容?如果只是关于添加行为,然后你可能想考虑一个<代码>代理>代码>模型,但我不知道它们是如何与信号交互的…