gpt4 book ai didi

python - Django:检索用户模型时自动选择相关模型UserProfile

转载 作者:太空宇宙 更新时间:2023-11-03 14:02:48 25 4
gpt4 key购买 nike

在 Django 模板中显示 {{ user }} 时,默认行为是显示用户名,即 user.username

我正在更改此设置以显示用户的姓名首字母缩写,这些缩写存储在单独的 (OneToOneField) UserProfile 模型中。

因此,在 customsignup/models.py 中,我已成功覆盖 __unicode__ 函数,并获得了所需的结果:

# __unicode__-function overridden.
def show_userprofile_initials(self):
return self.userprofile.initials
User.__unicode__ = show_userprofile_initials

但是,当然,数据库会再次受到攻击,因为每次要求 user 对象将其自身显示为字符串时,数据库都需要独立选择 UserProfile 模型。因此,即使这有效,它也会大大增加数据库命中的数量。

所以我想做的是,每当从数据库调用 User 模型时,自动使用 select_lated('userprofile') ,因为我会在与用户打交道时,本质上始终需要配置文件。

用更专业的术语来说,我正在尝试覆盖现有模型的模型管理器。因此,我无法控制 User 模型定义本身,因为它位于导入的库中。

因此,我尝试以与覆盖 __unicode__ 函数相同的方式覆盖 User 模型的 objects 成员,如下所示:

# A model manager for automatically selecting the related userprofile-table
# when selecting from user-table.
class UserManager(models.Manager):
def get_queryset(self):
# Testing indicates that code here will NOT run.
return super(UserManager, self).get_queryset().select_related('userprofile')
User.objects = UserManager()

这应该有效吗?如果是这样,我错了什么?

(如果答案可以表明这本来就不应该起作用,我会将其标记为正确答案。)

我发现了一个类似的问题在这里,但它是从另一端解决的: Automatically select related for OneToOne field

最佳答案

不,User.objects = MyManger() 不应该工作。 According to the docs ,只有两种受支持的方法来扩展提供的身份验证用户模型,要么是 profile 模型,就像您正在做的那样,要么是 proxy 模型,这可能不适合你的情况。来自文档(添加了重点):

There are two ways to extend the default User model without substituting your own model. If the changes you need are purely behavioral, and don’t require any change to what is stored in the database, you can create a proxy model based on User. This allows for any of the features offered by proxy models including default ordering, custom managers, or custom model methods.

If you wish to store information related to User, you can use a OneToOneField to a model containing the fields for additional information. This one-to-one model is often called a profile model, as it might store non-auth related information about a site user.

作为扩展所提供的身份验证用户模型的替代方法,您可以 provide your own custom User model 。然后您将完全控制其管理人员。

相反,请考虑简单地将 {{ user }} 替换为 {{ user.profile.initials }}。在配置文件模型上创建 OneToOne 字段还会为相关模型的实例创建反向访问器。您可以通过配置文件模型字段上的 related_name 关键字参数指定反向访问器名称。例如...

from django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model)
user = models.OneToOneField('auth.User', related_name='profile')
initials = models.CharField(max_length=6)

some_user = User.objects.first()
# assuming there is already a profile related to this user
some_user.profile.initials = 'S.P.Y.'

您还可以为您的配置文件模型创建一个 __str__ 方法,例如

def __str__(self):
return self.initials

然后,当您在模板中执行 {{ user.profile }} 时,将显示缩写。

关于python - Django:检索用户模型时自动选择相关模型UserProfile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49134786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com