Python 我如何知道Django';s Model.save()方法?
我重写了Django的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
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
将引用错误的值(创建时的值,而不是最近的值)