Джанго: доступ к дочернему классу абстрактной модели - PullRequest
1 голос
/ 28 октября 2010

У меня есть несколько моделей профилей пользователей, унаследованных от одного базового класса, например:

class BaseProfile(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=100)
    ...
    class Meta:
        abstract = True

class DoctorProfile(BaseProfile):
    license_no = models.CharField(max_length=10)
    ...

class PharmacistProfile(BaseProfile):
    pass

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

Мне не хочется проверять, есть ли у пользователя профиль один за другим с помощью sth. как это:

if user.doctorprofile_set.all().count() == 1:
    return user.doctorprofile_set.all()[0]
elif user.pharmacistprofile_set.all().count() == 1:
    return user.pharmacistprofile_set.all()[0]
...

для каждого профиля - лучший способ, поскольку он не СУХОЙ и требует дополнительных запросов к базе данных.

Каков наилучший способ сделать это?

edit: было бы неплохо определить AUTH_PROFILE_MODULE в настройках, чтобы указывать на базовую модель, такую ​​как AUTH_PROFILE_MODULE = 'profiles.baseprofile', и иметь возможность использовать user.get_profile () для каждого пользователя с различными классами профилей, производными от того же Базовый профиль.

1 Ответ

1 голос
/ 28 октября 2010

Сделайте его OneToOneField вместо FK, затем выполните user.doctorprofile и т. Д. OneToOne выбросит Foo.DoesNotExist или Foo.MultipleObjectsReturned, однако, если что-то пойдет не так, будьте готовы перехватить эти исключения

...