3

Использование наследования несколькими столами, у меня есть две модели:Джанго добавление `choices` в унаследованной поле модели

class Bird(models.Model): 
    color = models.CharField() 

class Bluebird(Bird): 
    ... 

Используя эти модели, я могу это сделать:

birds = Bird.objects.all() 
for bird in birds: 
    print bird.color 

Это супер просто, но я не люблю позволять людям определять произвольные значения цвета в некоторых случаях. Например, я хочу, чтобы пользователи не создавали объекты Bluebird, для которых поле цвета установлено на все, кроме "blue" или, в более редких случаях, "grey" или "brown". Другими словами, я хочу установить choices kwarg на унаследованное поле color из модели Bluebird. Из беглого интернет-поиска кажется, что Django в настоящее время не позволяет подклассам модели переопределять поля родителя.

Как сохранить доступ к полю color в родительском классе при определении приемлемого выбора в дочернем?

EDIT: Этот вопрос фокусируется на Django < 1.8. В 1.8 была добавлена ​​возможность передать вызываемый для поля choices kwarg, и хотя это было бы неплохо, я имею дело с системой, которая еще не обновлена, и обновление в настоящее время не является вариантом.

+0

Простой подход может заключаться в том, чтобы оставить «цвет» самостоятельно и просто сделать это с помощью валидации. (То есть, пользователь может выбрать что-то другое, чем 'blue', но проверка отклонит его как недопустимый вариант.) –

+1

Хотя это будет держать данные действительными, в результате пострадает пользовательский опыт. В худшем случае (т. Е. У них нет самой туманной идеи, какие цвета могут быть у определенного вида птицы), они будут сведены к угадыванию, если действительные варианты не будут представлены им формой. Представление параметров путем переопределения поля ModelForm в настоящее время является тем, как я приближаюсь к этой проблеме. – user3934630

ответ

0

Используйте свойство.

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

class Bird(models.Model): 
    COLOR = None 

    @property 
    def color(self): 
     return self.COLOR 

class BlueBird(Bird): 
    COLOR = 'Blue' 

>>> b = BlueBird() 
>>> b.color 
'Blue' 
Смежные вопросы