Python Django中有多个配置文件?
是否可以将Django的用户身份验证功能用于多个配置文件 目前,我有一个settings.py文件,其中包含以下内容: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
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