Django:通过通用名称访问子不同子类的方法

时间:2010-08-11 11:17:42

标签: python django inheritance abstract

我有一个抽象基类,用于定义不同用户配置文件共享的公共属性。

class Profile(models.Model):
   ...

   def has_permissions(self, project):
      ...

   class Meta:
      abstract = True

class Standard(Profile):
   ...

class Premium(Profile):
   ...

现在我想检查某个用户的权限(总是分配一个不同的个人资料),而不必知道他有哪个个人资料,比如

user.profile.has_permission(project)

但这不起作用,因为“Profile”基类是抽象的。 有办法解决这个问题吗?有没有办法从子对象中发现抽象父类的名称?

谢谢, 丹尼尔

2 个答案:

答案 0 :(得分:1)

覆盖auth.User方法get_profile()以在所有子配置文件模型中进行调查直到找到它:

  class MyUser(auth.models.User):
        profile = models.OneToOneField(Profile)
        def get_profile(self):
            prof = None
            try:
                prof = Standard.objects.get(id=self.profile.pk)
            except ObjectDoesNotExist:
                prof = Premium.objects.get(id=self.profile.pk)
            return prof

现在,而不是这样做:

user.profile.has_permission(project)

你可以用这个:

user.get_profile().has_permission(project)

我希望它会对你有所帮助。

答案 1 :(得分:0)

我并不完全相信这是最好的方法。代码在对象意义上是正确的,但似乎不适合数据库视图(恕我直言)。 User只有一个profile,但数据库表将包含指向多个Profile表的链接。

怎么样:

  1. 在通用关系中创建可以连接到任何类型的配置文件的配置文件
  2. 拥有一个Profile类并根据实例属性('premium'或'standard')
  3. 定义权限

    我很想知道其他人的想法。