В.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.
, Классы могут быть ничем - ссылка может указать на пустой указатель.
Структуры являются фактическим значением - они могут быть пустыми, но никогда пустыми. Поэтому структуры всегда имеют конструктора по умолчанию без параметров - им нужно 'начальное значение'.
Решение, которое делает выполните запрос к базе данных:
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__
Другой способ, включающий переопределение __ setattr __
, подробно обсуждается в этом билете Django .