Почему я не могу получить доступ к типу подкласса для моих Django экземпляров модели? - PullRequest
1 голос
/ 01 мая 2020

У меня есть что-то вроде этого:

class Cat(models.Model):
    #some fields
class SiameseCat(Cat):
    #some additional fields

for cat in pet_store.cats.all(): 
    print(isinstance(cat, SiameseCat))
    print(type(cat))

Даже когда мои экземпляры SiameseCats видны под отдельным заголовком на странице администрирования django, мне всегда выводится «False, Cat» на терминал для каждая кошка в зоомагазине. Если я пытаюсь print(cat.siamese_only_field), я получаю ошибку атрибута.

Мне нужно получить доступ и вывести поле siamese_only_ для моего проекта. Кроме того, все это, как правило, головная боль, и я хотел бы знать, что я делаю неправильно. Почему я не могу получить доступ к подклассу модели объекта, как ожидается?

1 Ответ

1 голос
/ 01 мая 2020

Django реализует подклассы моделей путем добавления (неявного) OneToOneField к дочерней модели SiameseCat, которая ссылается на Cat.

Таким образом, вы можете стремиться получить доступ к SiameseCat модель с:

for cat in pet_store.cats.all():
    try:
        siamese_cat = <b>cat.siamesecat</b>
        print('siamese_cat')
    except SiameseCat.DoesNotExist:
        print('simple cat')

Вы можете повысить эффективность этого подхода, используя .select_related('siamesecat') для загрузки объектов сиамского кота в том же запросе:

for cat in pet_store.cats.<b>select_related('siamesecat')</b>:
    try:
        siamese_cat = <b>cat.siamesecat</b>
        print('siamese_cat')
    except SiameseCat.DoesNotExist:
        print('simple cat')

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

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