我正在尝试使用信号来更新记录,并遇到“递归错误”。
我要实现的目标:将新的customUser保存到数据库中后,我想查看用户是否在deviceSerial字段中输入了序列号。如果有序列号,我想将“ isDevice”设置为True,因为它默认为false。 当我使用.save()时,似乎出现了问题。我假设我需要使用某种类型的更新命令来代替?
错误消息:
Exception Type: RecursionError
Exception Value: maximum recursion depth exceeded
Exception Location:
C:\Users\matth\AppData\Local\Programs\Python\Python36\lib\copyreg.py in __newobj__, line 88
Python Executable:
C:\Users\matth\AppData\Local\Programs\Python\Python36\python.exe
我的模型。py:
from django.db import models
from django.conf import settings
from defaults.models import DefaultDMLSProcessParams
from django.contrib.auth.models import AbstractUser
from django.db.models.signals import post_save
from django.db.models.signals import pre_save
from django.core.files.storage import FileSystemStorage
fs = FileSystemStorage(location='/media/photos')
class CustomUser(AbstractUser):
customerTag = models.CharField(max_length=50,)
isAdmin = models.BooleanField(default = False,)
isDevice = models.BooleanField(default = False,)
notifications = models.BooleanField(default = True,)
deviceSerial= models.CharField(max_length=50,)
equipmentName= models.CharField(max_length=50,default=(str(equipment)+str(id)),)
equipmentDescription = models.CharField(max_length=200,)
image = models.ImageField(storage=fs, blank = True)
def create_machine(sender, instance,**kwargs):
hasSerial = len(instance.deviceSerial)
if hasSerial >1:
newRecordID = instance.id #grab id of record that was just saved
newRecord = CustomUser.objects.get(id=newRecordID) #get object
newRecord.isDevice = True #set to True
newRecord.save(update_fields=['isDevice']) #save it
else:
#future code
pass
post_save.connect(create_machine, sender = CustomUser)
答案 0 :(得分:2)
是的。使用模型管理器的update()
方法:
CustomUser.objects.filter(id=instance.id).update(isDevice=True)
但是可以使用pre_save
信号代替多个数据库命中。在这种情况下,您可以在保存实例之前设置isDevice
属性:
def set_is_device(sender, instance,**kwargs):
hasSerial = len(instance.deviceSerial)
if hasSerial > 1:
instance.isDevice = True
pre_save.connect(set_is_device, sender=CustomUser)
答案 1 :(得分:1)
问题是您正在同一模型对象的.save()
信号中调用post_save
方法。这意味着您正在创建无限循环,因为post_save
将在每次.save()
调用之后触发。解决方案是使用pre_save
信号并在isDevice
调用之前修改.save()
的值。基本示例:
def create_machine(sender, instance,**kwargs):
if instance.deviceSerial:
instance.isDevice = True #set to True
else:
#future code
pass
pre_save.connect(create_machine, sender = CustomUser)