Проверьте, является ли объект, полученный из коллекции Базового класса, объектом подкласса в Django - PullRequest
0 голосов
/ 09 февраля 2012

Вопрос новичка по Python и django, вот код:

class Client(User)
   #some fields

client=Client()
client.save()

user=User.objects.all()[0]

#want to ckeck type of user, expect that it is Client:
isinstance(user,Client) #returns false

#but this works:
isinstance(user,User) #returns true

Но я ожидаю, что пользователь - Клиент.Что не так?

Добавление: Сначала нужно получить объект подкласса, и он отлично работает:

if hasattr(user,'client'):
        client=user.client

Добавление 2: Ребята, вытак зла, что боюсь больше постить в этом вопросе :) Он закрыт, и я полностью осознал свой абсолютный вакуум в знании django, python, полиморфизма и других IT-технологий, спасибо))

Ответы [ 2 ]

2 голосов
/ 09 февраля 2012

Проблема в том, что наборы запросов Django не знают о наследовании. Поэтому, когда вы запрашиваете пользователя, он никогда не вернет подклассы.

Самое простое решение - сделать что-то вроде этого:

try:
    client = user.client
except Client.DoesNotExist:
    # handle exception

Конечно, если у вас есть несколько подклассов пользователя, это немного сложнее. Существуют способы заставить Django правильно наследовать модели, но все они немного хакерские.

0 голосов
/ 09 февраля 2012

ваши ожидания неверны.Вы запрашиваете класс User, почему вы ожидаете получить Client из него?!

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