Python 我如何知道Django';s Model.save()方法?

Python 我如何知道Django';s Model.save()方法?,python,django,Python,Django,我重写了Django的Model.save()方法,以便在添加或更新对象时对外部数据库执行操作 基本上,我的方法是: def save(self, *args, **kwargs): if self.pk is None: # Insert query on the external database. else: # Update query on the external database. super(MyModel, se

我重写了Django的Model.save()方法,以便在添加或更新对象时对外部数据库执行操作

基本上,我的方法是:

def save(self, *args, **kwargs):    
    if self.pk is None:
        # Insert query on the external database.
    else:
        # Update query on the external database.

    super(MyModel, self).save(*args, **kwargs)
我现在的问题是,我知道我可以访问提交的数据,例如只需执行self.name,但我如何访问旧数据?我的意思是,现有的数据,当然是在更新的情况下

因为这是我的问题,外部数据库不支持很多查询,我只想在相关字段被更新时进行查询

以下是我想做的:

def save(self, *args, **kwargs):    
    if self.pk is None:
        # Insert query on the external database.
    else:
        if self.name is not self.THE_CURRENT_NAME
            # Update query on the external database.

    super(MyModel, self).save(*args, **kwargs)

有人有想法吗?

您必须在保存之前从数据库中获取:

def save(self, *args, **kwargs):    
    if self.pk is None:
        # Insert query on the external database.
    else:
        old = Lab.objects.get(pk=self.pk)
        if self.name is not old.name:
            ...             

    super(Lab, self).save(*args, **kwargs)

如果您正在为作业使用
ModelForm
,请覆盖其上的
save
方法,并决定是否级联到模型的
save
(使用
commit=True
调用
super

你可能已经掌握了这一点的所有信息。现在你需要一种方法来使用它

django中的表单具有满足您需要的工具。签出表单的
changed\u data
属性和
has\u changed()
方法

class MyModelForm(forms.ModelForm):

    class Meta:
        model = MyModel

    def save(commit=True):
        if self.has_changed():
            super(MyModelForm, self).save(commit=commit)

因此,您希望从数据库中获取数据,而不希望进行许多查询。如果您的数据不太多,您可以将数据库中的所有数据读取到内存中,然后将即将保存的值与内存中的数据进行比较,如果它们不相同,只需将该值分配给内存数据以及数据库中的更新。

他说他希望避免查询,而您的解决方案添加了一个。他说外部数据库不支持很多查询,本地数据库不支持。但是,没有其他通过
save
方法的方法(AFAIK),当然有。重写
\uuuu init\uuuu
方法以存储
\u原始名称
,并在以后的
保存
“通过
保存
方法”中将其与之进行比较,即OP要求的内容。此外,重写
\uuu init\uuu
是危险的。如果属性get在其生存期内保存了一次以上,
\u original\u name
将引用错误的值(创建时的值,而不是最近的值)