Python Django从模型中保存以前的对象

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

在Django管理站点中,我有这个类。 我想保存一个对象(服务器)的早期版本,这是一个用于查找对象更改的多个字段

对于普通CharField,这项工作正常,但对于许多字段,我都会出现以下错误:

"<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”效果良好