2009-12-19 2 views
1

У меня есть следующая модель в Джанго:Как изменить max_length в подклассе django?

class Node(models.Model): 
    name = models.CharField(max_length=255) 

И этот подкласс выше модели:

class Thingy(Node): 
    name  = models.CharField(max_length=100) 
    otherstuff = models.CharField(max_length=255) 

Проблема с этой установки является то, что в то время как все просто работает, заглянуть в шоу базы данных что syncdb создал две таблицы. Один из них называется appname_node с колонкой name, а другой - appname_thingy с двумя колонками: name и otherstuff. Когда создается новый объект, значение name копируется в обе таблицы ... не очень классно, если вы копаете всю концепцию нормализации :-)

Может кто-нибудь объяснить мне, как я могу изменить значение max_length Свойство «name» в «Thingy» без переопределения?

ответ

3

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

правильная реализация

class Node(models.Model): 
    #other class attributes 

дочерний класс должен наследовать родительские атрибуты и добавить свой собственный материал.

class Thingy(Node): 
    name  = models.CharField(max_length=100) 
    otherstuff = models.CharField(max_length=255) 

Теперь, когда вы запрашиваете запрос, вы получаете только одно имя вместо двух.

+0

Mohamed - это правильно. Прочтите http://docs.djangoproject.com/en/dev/topics/db/models/#id5. В зависимости от специфики вашей проблемы вы можете рассмотреть использование абстрактных базовых классов в отличие от истинного многозначного наследования. –

+0

Извините, я сохранил некоторые вещи, чтобы упростить вопрос - для начала родительская модель не может быть абстрактной, поскольку в ней есть ограничения внешнего ключа. Что касается изменения max_length в дочернем элементе, сохраняя свойство в родительском, вы оба говорите мне, что Django не поддерживает переопределение атрибутов свойства из родителя? Значение «имя» должно оставаться в родительском. Это распространено во всех детских моделях, и слишком много других общих свойств, которые должны существовать у этого ребенка. Если я не могу изменить этот атрибут, мне придется в основном скопировать «узел» :-( –

+0

Да, django рассматривает каждый класс модели как таблицу базы данных. – Mohamed

Смежные вопросы