【发布时间】:2010-10-28 16:57:57
【问题描述】:
我有几个从一个基类继承的用户配置文件模型,如下所示:
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
当我有一个用户实例时,我想获取他们的个人资料。
我不想一一检查用户是否有个人资料。像这样:
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]
...
每个配置文件都是最好的方法,因为它不是 DRY 并且需要对数据库进行额外查询。
最好的方法是什么?
编辑: 最好在设置中定义 AUTH_PROFILE_MODULE 以指向像 AUTH_PROFILE_MODULE = 'profiles.baseprofile' 这样的基本模型,并能够对每个具有不同配置文件类的用户使用 user.get_profile() 从相同的基本配置文件。
【问题讨论】:
-
我能问一下您为什么选择使用继承而不是组合或聚合作为划分不同类型用户的方式吗?为什么带有“is_a”标志的单个配置文件类不是正确的方法?然后你可以使用 get_profile() 做一件事。
-
我提供的例子是一个简化的例子。在实际情况下,大约有 10 种不同的配置文件类型,它们具有许多常见和不常见的属性。为了保持模型 DRY,继承对我来说似乎更自然。即使我使用了组合,我相信在尝试获取用户的个人资料时我仍然会遇到同样的问题,不是吗?
标签: django inheritance abstract-class