Можно ли узнать, “грязен” ли экземпляр Django Model?

В.NET структура и объявления класса дифференцируются между ссылочными типами и оценивают типы.

, Когда Вы передаете по кругу ссылочный тип, существует только один на самом деле сохраненный. Весь код, который получает доступ к экземпляру, получает доступ к тому же.

, Когда Вы передаете по кругу значение, вводят, каждый - копия. Весь код работает над своей собственной копией.

Это можно показать с примером:

struct MyStruct 
{
    string MyProperty { get; set; }
}

void ChangeMyStruct(MyStruct input) 
{ 
   input.MyProperty = "new value";
}

...

// Create value type
MyStruct testStruct = new MyStruct { MyProperty = "initial value" }; 

ChangeMyStruct(testStruct);

// Value of testStruct.MyProperty is still "initial value"
// - the method changed a new copy of the structure.

Для класса это было бы отличающееся

class MyClass 
{
    string MyProperty { get; set; }
}

void ChangeMyClass(MyClass input) 
{ 
   input.MyProperty = "new value";
}

...

// Create reference type
MyClass testClass = new MyClass { MyProperty = "initial value" };

ChangeMyClass(testClass);

// Value of testClass.MyProperty is now "new value" 
// - the method changed the instance passed.

, Классы могут быть ничем - ссылка может указать на пустой указатель.

Структуры являются фактическим значением - они могут быть пустыми, но никогда пустыми. Поэтому структуры всегда имеют конструктора по умолчанию без параметров - им нужно 'начальное значение'.

11
задан Community 23 May 2017 в 12:08
поделиться

2 ответа

Решение, которое делает выполните запрос к базе данных:

class DirtyMixin(object):
    @property
    def is_dirty(self):
        db_obj = self.__class__.objects.get(self.pk)
        for f in self._meta.local_fields:
            if self.__getattribute__(f.name) != db_obj.__getattribute__(f.name):
                return True
        return False

Затем вы можете добавить это как класс-предок к модели. Или, если хотите, внесите исправления в класс forms.Model.

from django.db import models
models.Model.__bases__ = (DirtyMixin,) + models.Model.__bases__
4
ответ дан 3 December 2019 в 11:04
поделиться

Другой способ, включающий переопределение __ setattr __ , подробно обсуждается в этом билете Django .

2
ответ дан 3 December 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: