我正在研究 Django 1.5 项目。
该应用程序包含的用户层次结构
Owner
Admin
Viewer
- 所有者拥有数据库中的所有数据。
- 管理员用户由所有者创建,并具有不同的登录凭据。可以在“所有者”下添加/编辑/删除数据。
- 查看器用户由所有者创建,并具有不同的登录凭据。可以查看在所有者下创建的数据。
用户模型具有字段is_shared
(布尔值)以标识主要用户和共享用户,并且access_level
映射到另一个模型 MultiUser 中。
我已经考虑过以这种方式实现
get_queryset
。is_shared=True
,将在哪里进行第一次检查user
,然后代表用户过滤记录。但这需要在整个应用程序视图集中进行更改。
是否可以在不更改整个应用程序的情况下执行此操作。
可能是middleware
。
编辑2:多用户模型
class MultiUser(models.Model):
user = models.ForeignKey(User, related_name='owner_user')
shared_user = models.ForeignKey(User, related_name='shared_user')
access_level = models.CharField(max_length=50)
答案 0 :(得分:1)
代替更新所有视图集,您可以使用单个基类来处理。
from django.http import HttpResponse
from django.views import View
class BaseView(View):
def get_queryset(self, request):
if request.user.is_shared:
#some is_shared value
u = MultiUser.objects.filter(user=request.user)
if u.exists():
return #some multiuser value
else:
return #some non multi user value
class Meta:
abstract=True
class MyView(BaseView):
def get(self, request):
q = self.get_queryset
#view logic
return HttpResponse('result')
class MyView2(BaseView):
def get(self, request):
q = self.get_queryset
#view logic
return HttpResponse('result')
答案 1 :(得分:0)
我通过创建一个具有内容的中间件来解决了这个问题
class MultiUserMiddleware(object):
def process_request(self, request):
"""
Check if user profile is is_shared=True
If user is a shared user, get owner user from multi user
and assign owner user to request.user
Any multi user profile created by the owner user will work on behalf of the owner user
"""
user = request.user
if not user.is_anonymous():
# if request.path in settings.MUTLIUSER_ALLOWED_PATH:
# return None
# Search using wildcard
if any(fnmatch(request.path, p) for p in settings.MUTLIUSER_ALLOWED_PATH):
return None
try:
if user.profile.get().is_shared:
owner = MultiUser.objects.filter(shared_user=user)[0].user
request.user = owner
except:
return None
return None
该中间件检查用户的帐户是否是基于is_shared
的共享用户,然后使用所有者用户对象更改request.user。这也可以防止更改设置文件中定义的特定路径(例如,配置文件,change_password等)的请求所有者。