Как создать поле модели Django, которое имеет значение по умолчанию, если когда-либо установлено в нуль - PullRequest
1 голос
/ 28 января 2010

Учитывая модель

class Template(models.Model):
    colour = models.CharField(default="red", blank = True, null=True)

Как мне сделать так, чтобы любой доступ к цвету либо возвращал значение, сохраненное в поле, либо, если поле пустое / пустое, то возвращал красный?

default=red
будет ставить "красный" в поле при его первом создании, но если его затем отредактировать до пустого, я бы хотел, чтобы доступ к нему возвращал "красный", а не ""

Обновлено: я попробовал решение для свойств, предложенное ниже, но я использую сериализацию JSON для реализации REST API, и свойства (например, colour) не сериализуются, а сериализация _colour нарушает API

Ответы [ 3 ]

4 голосов
/ 28 января 2010

Вместо этого вы можете создать отдельный метод:

def get_colour(self):
    if not self.colour:
        return 'red'
    else:
        return self.colour

Альтернативой является использование свойства.

http://www.djangoproject.com/documentation/models/properties/

1 голос
/ 28 января 2010

Используйте метод save для реализации этого.

def save( self, *args, **kw ):
    if self.colour is None:
        self.colour= 'red'
    super( ThisModel, self ).save( *args, **kw )
0 голосов
/ 29 января 2010

Вот как я решил эту проблему.

Сначала некоторые предварительные условия: у меня есть существующий код, который обращается к этим именам полей (например, 'color'), и поле также сериализуется (с помощью django-rest-interface) как часть API. Ни одна из этих вещей не может быть изменена.

Попытка метода свойств работала нормально, за исключением того, что colour больше не был полем, поэтому его не сериализовали. Результат: неработающий API

Затем перешел к решению save () вместе с пользовательским атрибутом в каждом поле, который должен вести себя так:

class ColourChoices(models.Model):
    colour1 = models.CharField()
    colour1.colour_default = "red"
    colour2 = models.CharField()
    colour2.colour_default = "blue"

    def save(self, *args, **kwargs):
        # force colour fields to default values
        for f in [ x for x in self._meta.fields if hasattr(x, 'colour_default') ]:
            if self.__getattribute__(f.attname) == "":
                self.__setattr__(f.attname, f.colour_default)
       super(ColourChoices, self).save(*args,**kwargs)

Теперь все работает нормально и по мере необходимости.

Единственная проблема, связанная с этим решением, заключается в том, что при изменении значений по умолчанию невозможно определить, какие поля базы данных должны иметь обновленные значения по умолчанию, а какие просто случайно имеют тот же цвет, что и старые значения по умолчанию. Однако для моего приложения я могу жить с этим.

...