我有这个代理模型:
class OrderedUser(User):
def __unicode__(self):
return self.get_full_name()
class Meta:
proxy=True
ordering=["first_name", "last_name"]
我的一些其他模型使用OrderedUser
而不是django.contrib.auth.models.User
作为字段类型。
在我的视图中,我使用request.user
填充一个字段,并如预期的那样得到一个错误:
'Cannot assign "<User...>": <field> must be a "OrderedUser" instance'
我可以只做OrderedUser.objects.get(request.user.id)
,但这对数据库来说是额外的打击。
那么,如何将基模型类转换为它的代理类呢?
发布于 2010-06-09 22:31:03
这是另一个数据库命中,但这将会起作用:
OrderedUser.objects.get(pk=request.user.pk)
编辑您可以尝试:
o = OrderedUser()
o.__dict__ = request.user.__dict__
发布于 2014-02-07 13:36:10
我无法让copy dict方法在Python 2.7.4和Django 1.6上工作。我没有一直跟踪它,但我认为这与它是一个懒惰的对象有关。
对我起作用的是:
request.user.__class__ = OrderedUser
它避免了数据库调用,并提供了对基本身份验证内容和所有扩展行为的访问。
为了使request.user始终像代理类一样工作,我将赋值放在中间件中,放在身份验证中间件之后,我的任何应用程序都可以引用它。由于每次请求都会调用中间件,因此在设置类之前,请确保对用户进行了身份验证。使用您的示例,下面是中间件代码可能的样子:
from yourapp.models import OrderedUser
class OrderedUserMiddleware():
def process_request(self, request):
if hasattr(request, 'user') and request.user.is_authenticated():
request.user.__class__ = OrderedUser
并记住在认证后注册中间件:
MIDDLEWARE_CLASSES = [
# ...middleware from the guts of Django, none of your middle wares yet...
'django.contrib.auth.middleware.AuthenticationMiddleware',
# ...more middleware from the guts of Django, none of your middlewares yet...
'yourapp.middleware.OrderedUserMiddleware',
# ...more middleware from you other middlewares...
]
https://stackoverflow.com/questions/3006753
复制相似问题