У меня есть модельный объект в Django. Один из методов объекта использует блокировку на уровне строк, чтобы обеспечить правильность значений так:
class Foo(model.Model):
counter = models.IntegerField()
@transaction.commit_on_success
def increment(self):
x = Foo.objects.raw("SELECT * from fooapp_foo WHERE id = %s FOR UPDATE", [self.id])[0]
x.counter += 1
x.save()
Проблема в том, что вы вызываете increment
в объект foo, значения объекта больше не отражают значения в базе данных. Мне нужен способ обновить значения в объекте или, по крайней мере, пометить их как устаревшие, чтобы они были переназначены, если необходимо. По-видимому, это функциональность, которую разработчики Django отказываются добавлять.
Я попытался использовать следующий код:
for field in self.__class__._meta.get_all_field_names():
setattr(self, field, getattr(offer, field))
К сожалению, у меня есть вторая модель со следующим определением:
class Bar(model.Model):
foo = models.ForeignKey(Foo)
Это вызывает ошибку, поскольку она отображается в списке полей, но вы не можете getattr
или setattr
.
У меня есть два вопроса:
-
Как обновить значения на моем объекте?
-
Нужно ли беспокоиться об обновлении любых объектов со ссылками на мой объект, например, внешние ключи?