Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django中有多个配置文件?_Python_Django_Django Authentication - Fatal编程技术网

Python Django中有多个配置文件?

Python Django中有多个配置文件?,python,django,django-authentication,Python,Django,Django Authentication,是否可以将Django的用户身份验证功能用于多个配置文件 目前,我有一个settings.py文件,其中包含以下内容: AUTH_PROFILE_MODULE = 'auth.UserProfileA' from django.db import models from django.contrib.auth.models import User class UserProfileA(models.Model): company = models.CharField(max_leng

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

目前,我有一个settings.py文件,其中包含以下内容:

AUTH_PROFILE_MODULE = 'auth.UserProfileA'
from django.db import models
from django.contrib.auth.models import User

class UserProfileA(models.Model):
    company = models.CharField(max_length=30)
    user = models.ForeignKey(User, unique=True)
以及包含以下内容的models.py文件:

AUTH_PROFILE_MODULE = 'auth.UserProfileA'
from django.db import models
from django.contrib.auth.models import User

class UserProfileA(models.Model):
    company = models.CharField(max_length=30)
    user = models.ForeignKey(User, unique=True)
这样,如果用户登录,我可以很容易地获取配置文件,因为用户有一个get_profile()方法。但是,我想添加UserProfileB。环顾四周,似乎起点是创建一个超类用作AUTH_PROFILE_模块,并使UserProfileA和UserProfileB都继承自该超类。问题是,我认为get_profile()方法不会返回正确的概要文件。它将返回超类的一个实例。我来自java背景(多态性),所以我不确定我应该做什么

谢谢

编辑:

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


它工作得非常好,但是,在java背景下,这种事情会自动发生,我有点不安,因为有人不得不编写代码,并称之为“黑客”才能在python中完成。python没有启用这一功能有什么原因吗?

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

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

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

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

class UserProfileA(UserProfile):
    pass

class UserProfileB(UserProfile):
    pass
要使用它:

try:
    profile = user.get_profile().userprofilea
    # user profile is UserProfileA
except UserProfileA.DoesNotExist:
    # user profile wasn't UserProfileB
    pass
try:
    profile = user.get_profile().userprofileb
    # user profile is UserProfileB
except UserProfileB.DoesNotExist:
    # user profile wasn't either a or b...
编辑:回复您的评论

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

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

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


另一方面,如果你想用个人资料做一些更有趣的事情,比如搜索居住在某个城市的用户,那么所有个人资料都必须为他们的城市属性建立索引。这与OOP无关,而与关系型无关。

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

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

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

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

class UserProfileA(UserProfile):
    pass

class UserProfileB(UserProfile):
    pass
要使用它:

try:
    profile = user.get_profile().userprofilea
    # user profile is UserProfileA
except UserProfileA.DoesNotExist:
    # user profile wasn't UserProfileB
    pass
try:
    profile = user.get_profile().userprofileb
    # user profile is UserProfileB
except UserProfileB.DoesNotExist:
    # user profile wasn't either a or b...
编辑:回复您的评论

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

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

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


另一方面,如果你想用个人资料做一些更有趣的事情,比如搜索居住在某个城市的用户,那么所有个人资料都必须为他们的城市属性建立索引。这与OOP无关,一切都与关系有关。

Pinax团队的idos应用程序旨在解决多配置文件问题。您可以调整模型以继承基本pro