Python Django从模型中保存以前的对象
在Django管理站点中,我有这个类。 我想保存一个对象(服务器)的早期版本,这是一个用于查找对象更改的多个字段 对于普通CharField,这项工作正常,但对于许多字段,我都会出现以下错误:Python Django从模型中保存以前的对象,python,django,django-models,django-admin,Python,Django,Django Models,Django Admin,在Django管理站点中,我有这个类。 我想保存一个对象(服务器)的早期版本,这是一个用于查找对象更改的多个字段 对于普通CharField,这项工作正常,但对于许多字段,我都会出现以下错误: "<SourceDestinationGroup: asdas>" needs to have a value for field "id" before this many-to-many relationship can be used. 您的SourceDestinationGroup
"<SourceDestinationGroup: asdas>" needs to have a value for field "id" before this many-to-many relationship can be used.
您的
SourceDestinationGroup
实例必须保存到数据库,然后才能向其中添加任何服务器。您可能可以通过save
方法轻松修复它:
def save(self, **kw):
if self.id is not None and self.Servers != self._old_Servers:
self.Status = 'C'
self._old_Servers = self.Servers
super(SourceDestinationGroup, self).save(**kw)
def update_m2m(self):
if self.Servers != self._old_Servers:
self.Status = 'C'
self._old_Servers = self.Servers
self.save()
如我所见,只有在存在任何旧值时,您对服务器的更改才有意义。您在创建对象时尝试初始化多个属性(.Servers) 无论您在何处尝试创建SourceDestinationGroup,您可能都应该创建它,然后执行以下操作:
group.Servers = servers
group.save()
或者,删除init方法中的Servers属性,然后将其重置:
def __init__(self, *args, **kw):
super(SourceDestinationGroup, self).__init__(*args, **kw)
self._temp_Servers = self.Servers
def save(self, **kw):
if self.id is None:
self._temp_Servers = self.Servers
self.Servers = None # Your 'Servers' attribute was still being set, hence raising an Exception in the super.save just after
super(SourceDestinationGroup, self).save(**kw)
if self._old_Servers is not None:
self.Servers = self._temp_Servers
super(SourceDestinationGroup, self).save(**kw)
几个月前我遇到了这个问题。m2m关系不会在model
save
方法中更新,即使在使用这些关系之前调用了super()
我发现的唯一解决方法是编写一个单独的函数来处理m2m关系,并从表单的save
方法调用它:
def save(self, *args, **kwargs):
instance = super().save(*args, **kwargs)
instance.update_m2m()
return instance
在您的情况下,此功能与您的型号save
方法几乎相同:
def save(self, **kw):
if self.id is not None and self.Servers != self._old_Servers:
self.Status = 'C'
self._old_Servers = self.Servers
super(SourceDestinationGroup, self).save(**kw)
def update_m2m(self):
if self.Servers != self._old_Servers:
self.Status = 'C'
self._old_Servers = self.Servers
self.save()
M2M关系不作为save()方法的一部分保存。 在管理中,保存主对象,然后保存m2m关系;因此,通过在save方法中序列化标记列表,可以在保存新值之前打印标记的值。
如果您想安装“post m2m save”行为,您需要覆盖管理员本身的更新视图。Thx以获取该建议。我试过了,但是错误消息是一样的。我想问题是从init函数开始的。请在问题中包含完整堆栈跟踪。对不起,我更改了代码,所以现在我收到了其他错误。在调试时,我检测到m2m的更改会影响站点上的下一次保存。这很奇怪。我可以更改m2m对象中的内容,但我在第二次保存时看到了更改。请仍然提供完整的堆栈跟踪。我解决了问题。问题是m2m对象不会在保存方法中更新自己。使用“m2m_changed”效果良好