Вот как я решил эту проблему.
Сначала некоторые предварительные условия: у меня есть существующий код, который обращается к этим именам полей (например, '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)
Теперь все работает нормально и по мере необходимости.
Единственная проблема, связанная с этим решением, заключается в том, что при изменении значений по умолчанию невозможно определить, какие поля базы данных должны иметь обновленные значения по умолчанию, а какие просто случайно имеют тот же цвет, что и старые значения по умолчанию. Однако для моего приложения я могу жить с этим.