Дополнительная информация для модели с несколькими типами - PullRequest
0 голосов
/ 05 сентября 2011

Я хочу сделать что-нибудь необычное в Django orm.

У меня есть модель Car. Как я могу расширить его дополнительной информацией, разделенной по типу, сохраняя в другой модели?

Например, для ввода Car «Мой грузовик», тип которого truck, я хочу расширить его на TruckInfo модель.

Еще одна запись «Мой автобус», которую я хочу дополнить моделью BusInfo.

Другими словами, я хочу создать плавающие отношения.

Это можно реализовать, добавив в столбец Car тип и выполнив SELECT дважды: 1) для выбора автомобилей, 2) для выбора дополнительной информации с помощью поля Car.Type. Но это ужасное решение. Я хочу сделать это одним запросом.

Может быть, вы знаете решение на чистом SQL, оно тоже будет полезно. Thx.

Ответы [ 2 ]

1 голос
/ 06 сентября 2011

Будет довольно сложно дать вам окончательный ответ, не спрашивая лот о ваших конкретных потребностях. Однако в ORM Django нет ничего, что мешало бы вам сделать это.

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

class Automobile(models.Model):
    [...]
    type = models.ChoiceField(choices=(
        ('car', 'Car'),
        ('truck', 'Truck'),
        ('bus', 'Bus'),
    ))

    @property
    def detail(self):
        return getattr(self, self.type)

class Car(Automobile):
    [...]

class Truck(Automobile):
    [...]

class Bus(Automobile):
    [...]

Убедитесь, что, если вы пойдете по этому пути, вы захотите прочитать документацию по наследованию нескольких таблиц: https://docs.djangoproject.com/en/1.3/topics/db/models/#multi-table-inheritance

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

Возможно, вам также понадобятся некоторые пользовательские сигналы, обеспечивающие точность данных, например, чтобы вы не сохранили запись Bus для автомобиля типа Truck.

0 голосов
/ 06 сентября 2011

Я полагаю, вы также можете сделать это:

class Automobile(models.Model):
    # ...

class Truck(models.Model):
    automobile = models.OneToOneField(Automobile, primary_key=True)
    # ...

class Bus(models.Model):
    automobile = models.OneToOneField(Automobile, primary_key=True)
    # ...

Некоторые объяснения здесь: Ссылка OneToOneField

и примерболее подробную информацию можно найти здесь: Пример отношения один-к-одному

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...