У меня есть объект модели в 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
его.
У меня два вопроса:
Как мне обновить значения моего объекта?
Нужно ли мне беспокоиться об обновлении каких-либо объектов со ссылками на мой объект, например, внешние ключи?