【问题标题】:Automatically select related for OneToOne field自动为 OneToOne 字段选择相关
【发布时间】:2013-11-09 12:23:29
【问题描述】:
在我的 Django 项目中,我为每个 django 用户都有一个 Profile,并且 Profile 与 Info 模型相关。两种关系都是 OneToOne。由于大多数时候我都在为用户使用 Profile 和 Info 模型,所以我希望默认选择这些模型,这样我就不会再次访问数据库。有没有办法使用 Django 身份验证来做到这一点?
【问题讨论】:
标签:
django-models
django-authentication
prefetch
【解决方案1】:
使用 django >=1.5 自定义用户模型使用选择相关功能。
user = User.objects.select_related('profile_related', 'info_related')
【解决方案2】:
我知道这已经存在了一段时间,但我正在添加我的解决方案以防其他人面临类似情况。
Django(从 v1.8 甚至 v1.7 开始)允许您自定义管理器(查询时使用的 .objects)
您可以为个人资料设置这样的经理:
class ProfileManager(models.Manager):
def get_queryset(self):
return super(ProfileManager,self).get_queryset().select_related('user')
然后在模型中:
class Profile(models.Model):
user = models.OneToOneField(
User,
primary_key=True,
on_delete=models.CASCADE
)
# ... other fields
# the manager
objects = ProfileManager()
# ...
那么您对个人资料的所有查询也会自动选择相关用户。
您也可以扩展此代码以包含 Info 模型。