Django:访问抽象模型的子类

时间:2010-10-28 16:57:58

标签: django inheritance abstract-class

我有几个从一个基类继承的用户配置文件模型,如下所示:

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()来自相同的基本配置文件。

1 个答案:

答案 0 :(得分:1)

将它设为OneToOneField而不是FK然后执行user.doctorprofile等。然而,如果出现问题,OneToOne将抛出Foo.DoesNotExist或Foo.MultipleObjectsReturned,因此请准备好捕获这些异常