Как обновить значения объекта в Django?

У меня есть объект модели в 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его.

У меня два вопроса:

  • Как мне обновить значения моего объекта?

  • Нужно ли мне беспокоиться об обновлении каких-либо объектов со ссылками на мой объект, например, внешние ключи?

26
задан Chris B. 20 March 2012 в 17:30
поделиться