首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何代表其他用户保存记录和获取记录

如何代表其他用户保存记录和获取记录
EN

Stack Overflow用户
提问于 2019-02-12 06:21:30
回答 2查看 78关注 0票数 1

我正在从事一个Django 1.5项目。

应用程序包含

代码语言:javascript
复制
Owner
Admin
Viewer

  • 所有者拥有数据库中的所有数据。
  • 管理员用户由所有者创建,并具有不同的登录凭据。可以添加/编辑/删除所有者下的数据。
  • 查看器用户由所有者创建,并具有不同的登录凭据。可以查看在所有者下创建的数据。

用户模型有一个字段is_shared (布尔值)来识别主用户和共享用户,access_level映射到另一个模型MultiUser中。

我已经想过要用这种方式来实现它。

  1. 更新所有视图集并在get_queryset中签入。
  2. 如果用户有is_shared=True,将进行第一次检查
  3. 然后签入MultiUser模型,
  4. MultiUser获取MultiUser,然后代表用户过滤记录。

但这将需要在整个应用程序视图集中进行更改。

有一种在不对整个应用程序进行更改的情况下这样做的方法。可能是middleware**.**

编辑2: MultiUser模型

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-20 13:27:16

我通过创建一个包含内容的中间件来解决这个问题。

代码语言:javascript
复制
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。这还防止更改设置文件(Ex.、profile、change_password等)中定义的特定路径的请求所有者。

票数 0
EN

Stack Overflow用户

发布于 2019-02-12 07:37:41

您可以使用单个基类来处理,而不是更新所有视图集。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54643932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档