У меня есть несколько моделей профилей пользователей, унаследованных от одного базового класса, как это:Джанго: Доступ к Дочерний класс абстрактной модели
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]
...
для каждого профиля - лучший способ, поскольку он не является СУХОЙ и требует дополнительных запросов в базе данных.
Каков наилучший способ для этого?
редактировать: бы неплохо определить AUTH_PROFILE_MODULE в настройках, чтобы указать на базовую модель, как AUTH_PROFILE_MODULE = 'profiles.baseprofile'
и быть в состоянии использовать user.get_profile() на каждом пользователе с различными классами профилей, полученных из того же базового профиля.
Могу ли я спросить почему вы решили использовать наследование, а не состав или агрегацию, как ваш способ разграничения между разными типами пользователей? Почему бы ни один класс профиля с флагом «is_a» не был правильным способом? Тогда вы можете использовать get_profile(), с одной стороны. –
Пример, который я предоставляю, является упрощенным. В реальном случае существует около 10 различных типов профилей со многими обычными и необычными атрибутами. Чтобы сохранить модели DRY, наследование кажется мне более естественным. И даже если бы я использовал композицию, я считаю, что у меня все еще будет такая же проблема при попытке получить профиль для пользователя, не так ли? – omat