对request.user使用代理类而不是User

Vir*_*liu 1 django django-models

我有一个Django User模型的元类,我用它来添加额外的方法(过度简化的版本):

# project.models.pie_lover.py

from django.contrib.auth.models import User

class PieLover(User):
    class Meta:
        app_label = "core"
        proxy = True

    def likes_pie(self):
        return True
Run Code Online (Sandbox Code Playgroud)

在我看来,我希望登录PieLover,看看他是否喜欢馅饼(愚蠢的事情要做,因为PieLover总是喜欢馅饼,但在现实世界的情况下,情况可能不是这样).我的问题在于Django登录用户的方式,我使用内置login(request)函数,因此存储的对象request.user是一个User对象,而不是PieLover.

# project.views.like_pie.py

from ..models.pie_lover import PieLover

def index(request):
    pie_lover = request.user

    if pie_lover.likes_pie():
        print "Try pie, try!"
    else:
        print "BLASPHEMER!"
Run Code Online (Sandbox Code Playgroud)

如果我尝试这样做,Django告诉我该User对象没有likes_pie预期的方法,因为request.user它不是一个PieLover实例.

作为一个快速的解决方法,我只是得到PieLover与其相同的ID,User但这意味着额外的数据库命中.

如何PieLover在请求中默认使用Django ?我在想,而不是进行另一个数据库查询来获取正确的PieLover对象来创建一个新PieLover对象并request.user在初始化时传递给它,但我不知道这是什么意思.

Vir*_*liu 6

在探索之后,我发现,在我看来,访问PieLover给定User实例的方法的最简单和非hackish方式.我已将此添加到自定义中间件:

from models.pie_lover import PieLover

class PieLoverMiddleware(object):
    def process_request(self, request):
        request.pie_lover = PieLover(request.user)
Run Code Online (Sandbox Code Playgroud)