用于访问用户配置文件的反向关系

时间:2018-01-02 16:27:55

标签: python django

在我的应用中,有些用户同时拥有0或1个个人资料。 随着时间的推移,我计划拥有许多不同的档案。

从profileX访问用户很简单:profile_x_object.user 但反向关系怎么样? 我想找到创建从用户到其个人资料的关系的最佳通用方法。

现在,我创建了一个名为profile的属性来填充该目的。 它有效但需要随着时间的推移更新foreach新的配置文件。 有什么想做的更好吗?

这是我的代码:

class User:
   # ...

    @property
    def profile(self):
        if hasattr(self, 'profilea'):
            return self.profilea
        if hasattr(self, 'probileb'):
            return self.probileb

class BaseProfile(models.Model):

    class Meta:
        abstract = True

    user = models.OneToOneField(settings.AUTH_USER_MODEL)

class ProfileA(BaseProfile, models.Model):
    # ...

class ProfileB(BaseProfile, models.Model):
    # ...

1 个答案:

答案 0 :(得分:1)

您可以使用model meta api并检查其related_model是BaseProfile子类的1对1字段:

from django.core.exceptions import ObjectDoesNotExist
from django.db.models.fields.related import OneToOneRel
from django.utils.functional import cached_property

class User(Abs...User):
    # ...

    @cached_property
    def profile(self):
        for f in User._meta.get_fields():
            if isinstance(f, OneToOneRel) and issubclass(f.related_model, BaseProfile):
                try:
                    return getattr(self, f.name)
                except ObjectDoesNotExist:
                    pass
        # no profile found
        return None