在我的应用中,有些用户同时拥有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):
# ...
您可以使用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