2013-02-12 4 views
0

я попытался сделать следующее в Django 1.4.3:Django подклассов класса, который подклассов абстрактного базового класса

class The_Image_Abstract(models.Model): 
    create_time = models.DateTimeField() 
    class Meta: 
     abstract = True 

class Imager(The_Image_Abstract): 
    time2 = models.DateTimeField() 

class ImagerB(Imager): 
    time3 = models.DateTimeField() 

но поле create_time не отображается как поле в ImagerB при выполнении SyncDB , Любые идеи, как это может проявиться? В противном случае мне придется повторить целую кучу вещей из Imager в ImagerB.

Спасибо,

Eras

ответ

0

Он покажет в Imager таблице не ImagerB.

Imager наследует от абстрактного класса The_Image_Abstract, но имеет свой собственный стол. Пока ImagerB наследуется от не-абстрактного класса Imager, поэтому поля в Imager помещены в таблицу Imager.

+0

Итак, какова точка подклассификации Imager? Я хотел придерживаться DRY путем подклассификации и подклассификации снова, чтобы сделать ImagerB более специализированной версией Imager. Теперь я должен повторить целую кучу вещей, которые были в Imager снова в ImagerB, если я пойду с ImagerB (The_Image_Abstract) – Seperman

+0

Вы все еще можете это сделать, django предоставит вам объекты ImagerB, которые имеют поля из «Imager», но внутренне он создаст разные таблицы. Надеюсь, вы прочитали этот https://docs.djangoproject.com/en/dev/topics/db/models/#model-inheritance – Rohan

+0

. Моя проблема, как вы сказали, заключается в том, что поля, определенные в Imager, отображаются в ImagerB, но поля, которые были в абстрактном базовом классе, которые были основой Imager, не отображаются в ImagerB. ImagerB бесполезен для меня без них. В основном ImagerB должен быть более специализированной версией Imager. – Seperman

2

Предполагая, что у вас нет дополнительных полей на Imager или ImagerB, тогда вы можете использовать proxy models.

Это позволяет сохранить одну таблицу db для базового класса и предоставить Imager и ImagerB общий доступ к данным - она ​​действительно работает как соответствующее Object Orientated Inheritance. Проблема в том, что у вас не может быть дополнительных полей для дочерних классов. Однако, если у вас есть немного гибкости, вы можете сделать поля необязательными в базовом классе, а затем потребовать или скрыть их на дочерних элементах.

UPDATE

Я до сих пор не удалось получить следующий код для работы, однако она может обеспечить некоторые идеи.

class TheImage(models.Model): 
    create_time = models.DateTimeField() 
    field2 = models.CharField(max_length=64, blank=True, null=True) 
    field3 = models.TextField(blank=True, null=True) 

class Imager(TheImage): 
    class Meta: 
     proxy = True 

    def __init__(self, *args, **kwargs): 
     for f in self._meta.fields: 
      if f.name == 'field2': 
       f.editable = False 
      if f.name == 'field3': 
       f.blank = False: 
     super(Imager, self).__init__(*args, **kwargs) 

class ImagerB(TheImage): 
    class Meta: 
     proxy = True 

    def __init__(self, *args, **kwargs): 
     for f in self._meta.fields: 
      if f.name == 'field3': 
       f.editable = False 
      if f.name == 'field2': 
       f.blank = False: 
     super(ImagerB, self).__init__(*args, **kwargs) 
+0

Это очень интересно. Позвольте мне попробовать, и я опубликую результаты. – Seperman

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