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

问题描述 投票:0回答:1

在我的应用中,有些用户同时拥有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):
    # ...
python django
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.