Django Multi-таблица наследования: укажите имя столбца один к одному - PullRequest
6 голосов
/ 01 сентября 2011

Я пытаюсь создать сопоставление Django ORM, совместимое с существующей моделью данных , поэтому я пытаюсь работать с существующим набором имен таблиц и столбцов.

У меня сложилась ситуация наследования нескольких таблиц, когда класс InformationObject наследуется от класса Object. Я хотел бы позволить Django справиться с этим обычным способом:

class Object(models.Model):
    class Meta:
        db_table = "object"          

class InformationObject(Object):
    class Meta:
        db_table = "information_object"

В этом случае Django автоматически создает однозначное поле в модели наследования с именем object_ptr_id . Однако в схеме, которую я вынужден использовать, ссылка на объект просто называется «id». Итак:

Есть ли способ как-то указать имя столбца, который Django автоматически использует для наследования нескольких таблиц?

Альтернатива, которую мне придется использовать в противном случае, состоит в том, чтобы использовать явное поле «один к одному», но тогда я не смогу унаследовать не относящиеся к базе данных методы из объектной модели:

class Object(models.Model):
    class Meta:
        db_table = "object"          

class InformationObject(models.Model):
    class Meta:
        db_table = "information_object"
    id = models.OneToOneField(Object, primary_key=True, db_column="id")  

Есть идеи? Может быть, я мог бы создать общий базовый класс для них обоих и поместить туда не-db методы ...?

Ответы [ 2 ]

8 голосов
/ 04 октября 2011

Из документов django (версия для разработки):

Как уже упоминалось, Django автоматически создаст OneToOneField, связывающий ваш дочерний класс со всеми неабстрактными родительскими моделями.Если вы хотите контролировать имя атрибута, связывающего обратно с родителем, вы можете создать свой собственный OneToOneField и установить parent_link = True, чтобы указать, что ваше поле является ссылкой на родительский класс.

1 голос
/ 20 февраля 2013

Как упоминалось при цитировании @fusion из документов, вам нужно будет создать OneToOneField, если вы хотите указать столбец, используя наследование модели. Унаследованные поля будут доступны в дочернем классе как в собственной области видимости, так и в поле «один к одному».

class Object(models.Model):
    class Meta:
        db_table = "object"   
    column_1 = models.CharField()

class InformationObject(Object):
    class Meta:
        db_table = "information_object"
    # arbitrary property name (parent_link)
    parent_link = models.OneToOneField(Object, primary_key=True, db_column="id", parent_link=True) 

В этом примере:

>>> inf_obj = InformationObject.objects.get(pk=1)
>>> print inf_obj.column_1 == inf_obj.parent_link.column_1
True
...