Django доступ к подклассам моделей - PullRequest
4 голосов
/ 02 мая 2011

Я использую подклассы в своих django-моделях, например:

class Person(models.Model):
    name = models.CharField(max_length=100)
    ...


class Butcher(Person):
    ...

class Driver(Person):
    ...

На мой взгляд, я хочу делать определенные вещи в зависимости от подкласса класса Person, например:

def person_detail_view(request, slug):
    person = Person.objects.get(slug=slug)

    if person.butcher:
        ...

    elif person.driver:
        ...

Но это дает мне ошибку DoesNotExist, когда человек является драйвером.Есть ли способ узнать у класса Person его подкласс?

Заранее спасибо, Жак

Ответы [ 3 ]

12 голосов
/ 02 мая 2011

Ваша основная логика - это звук; проблема в том, как вы тестируете. Вы должны проверить наличие атрибута, а не его значения. Например:

def person_detail_view(request, slug):
    person = Person.objects.get(slug=slug)

    if hasattr(person, 'butcher'):
        ...

    elif hasattr(person, 'driver'):
        ...
3 голосов
/ 02 мая 2011

Вы не можете этого сделать.Person модель запрашивает другую таблицу - appname_person, Butcher, другую и Driver другую.

Наследование в моделях Django только спасает вас от записи полей снова и незапрашивать несколько таблиц - это не должно быть либо.

Чтобы достичь чего-то для этого, у вас должно быть Person.type в БД, либо вы должны использовать Общие отношения , где вы делаете Person чтобы иметь общие отношения со всеми подтипами, которые вы намереваетесь создать (без фактического наследования и определения универсального внешнего ключа.)

Если поля в каждой из этих моделей совпадают, просто добавьте поле typeчеловеку;или если поля совсем другие, следуйте подходу родовых отношений.

1 голос
/ 12 апреля 2016

Джанго-полиморфный модуль действительно отлично справляется со своей работой и довольно прост в использовании.

...