В Django, как сохранить объект, только если поле имеет известное значение - PullRequest
1 голос
/ 19 ноября 2011

В Django я хотел бы сохранить объект, только если данное поле имеет известное значение, в противном случае я хотел бы получить исключение.

Есть ли другой способ сделать это вручнуюзаблокировать таблицу (или строку с поддержкой Django 1.4 SELECT FOR UPDATE) перед сохранением, чтением значения, проверкой и, если они совпадают, сохранением, иным образом вызывая исключение?

В SQL я мог бы сделать что-то вроде:

UPDATE table SET field='value' WHERE id=42 AND given_field='known_value'

и проверка количества обновленных строк.

Ответы [ 2 ]

1 голос
/ 19 ноября 2011

Вы можете поместить свой код проверки, например, в метод save.

from django.core.exceptions import ValidationError

class YourModel(models.Model):
    # fields

    def save(self, *args, **kwargs):
        if self.given_field == 'known_value':
            raise ValidationError(u"You can't do that!")
        super(YourModel, self).save(*args, **kwargs)

Единственное, что здесь происходит, это то, что 1) вы не получите эту проверку при использовании массового обновления и 2) этопроверка прервется в admin

(2) решается, если вы перенесете проверку в метод чистой модели.

0 голосов
/ 19 ноября 2011

Используйте метод update() набора запросов:

obj_data = dict((field.name, getattr(obj, field.name))
                    for field in obj._meta.fields)

rows_affected = MyModel.objects.filter(
                   id=obj.id, given_field='known_value').update(**obj_data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...