我如何知道Django的Model.save()方法中哪些值已更改?

时间:2013-04-03 07:06:01

标签: 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, 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)

有人有想法吗?

3 个答案:

答案 0 :(得分:1)

如果您正在使用ModelForm作业,请覆盖save方法并决定是否级联到模型的save(使用{{1}调用super })或不。

此时您可能掌握了所有信息。现在你需要一种方法来使用它。

django中的表单提供了所需的工具。查看表单的commit=True属性和changed_data方法。

has_changed()

答案 1 :(得分:0)

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

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)

答案 2 :(得分:0)

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