Django不止一个个人资料?

2024-06-16 10:13:33 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以将Django的用户身份验证功能用于多个配置文件?在

我现在有设置.py包含以下内容的文件:

AUTH_PROFILE_MODULE = 'auth.UserProfileA'

还有一个模型.py包含以下内容的文件:

^{pr2}$

这样,如果用户登录,我可以很容易地获得配置文件,因为用户有一个get_profile()方法。但是,我想添加UserProfileB。稍微看一下,我们的出发点似乎是创建一个超类来用作AUTH_PROFILE_模块,并让UserProfileA和UserProfileB都继承自该超类。问题是,我不认为get_profile()方法返回正确的概要文件。它将返回超类的一个实例。我来自java背景(多态性),所以我不确定我应该做什么。在

谢谢!在

编辑:

我找到了一种方法,通过我在这个网站上发现的一种叫做“继承黑客”的方法

它工作得非常好,但是,从java的背景来看,这种事情是自动发生的,我有点不安,因为有人必须编写代码并称之为“hack”来用python来完成它。python为什么不启用这个功能?在


Tags: 文件django方法用户py功能authget
3条回答

因此,您将面临的问题是,无论您想要什么样的概要文件,您都需要将其保存在某种类型的数据库中。基本上django的所有后端都是关系型的,因此持久化对象中的每个字段都出现在表的每一行中。有几种方法可以得到你想要的。在

Django为inheritance.提供了一些支持,您可以使用列出的技术以多态的方式获得合理的结果。在

最直接的方法是使用多表继承。大致:

class UserProfile(models.Model):
    # set settings.AUTH_PROFILE_MODULE to this class!
    pass

class UserProfileA(UserProfile):
    pass

class UserProfileB(UserProfile):
    pass

要使用它:

^{pr2}$

编辑:回复您的评论。在

关系模型暗示了许多具有面向对象哲学的东西。为了使关系有用,它要求关系中的每个元素具有相同的维度,以便关系查询对整个关系有效。由于这是先验的,在遇到存储在关系中的类的实例之前,该行不能是子类。django的orm通过将子类信息存储在不同的关系中(一个特定于子类的关系)来克服这种阻抗失配,还有其他解决方案,但它们都遵循关系模型的这种基本性质。在

如果这有助于您理解这一点,那么我建议您看看在没有ORM的情况下,RDBMs上的持久性是如何为应用程序工作的。特别是,关系数据库更多的是关于许多行的集合和摘要,而不是将行为应用于从数据库中提取的数据。在

使用django.contrib.auth的概要文件特性的具体示例是一个相当无趣的例子,特别是如果使用该模型的唯一方法是获取与特定的django.contrib.auth.models.User实例相关联的概要数据的话。如果没有其他查询,则根本不需要django.models.Model子类。您可以pickle一个常规的python类,并将其存储在一个没有特性的模型的blob字段中。在

另一方面,如果你想用profiles做更有趣的事情,比如搜索居住在某个城市的用户,那么所有的profiles都有一个城市属性的索引就很重要了。这与OOP无关,与关系型无关。在

以下是我关于如何使多个配置文件工作的问题的答案:

from django.contrib.contenttypes.models import ContentType
class Contact(models.Model):

    content_type = models.ForeignKey(ContentType,editable=False,null=True)

    def save(self):
        if(not self.content_type):
            self.content_type = ContentType.objects.get_for_model(self.__class__)
        self.save_base()

    def as_leaf_class(self):
        content_type = self.content_type
        model = content_type.model_class()
        if(model == Contact):
            return self
        return model.objects.get(id=self.id)

我真的不明白它为什么会起作用,或者django/python的开发人员为什么让继承以这种方式工作

Pinax团队开发的idos应用程序旨在解决多配置文件问题。您可以调整模型,使基概要文件类的继承既可以是抽象的,也可以是非抽象的。 https://github.com/eldarion/idios。在

相关问题 更多 >