我不太确定我在提问中使用的标题是否正确。如果以前已经回答过这个问题,那么应该有人指出我,因为我已经做了很多尝试来找出它,但是没有用。
我目前正在研究一个基本的人力资源系统,该系统可以供不同公司使用。以一种更加清晰的方式,我如何创建一个在线系统,使多个公司可以在线管理其员工而又无需访问彼此的数据?甚至不知道他们使用同一系统?这种系统的一个完美例子就是“ Zoho People”。
答案 0 :(得分:1)
好吧,您应该像这样创建模型
如果希望他们俩都登录系统
from django.db import models
from django.contrib.auth.models import AbstractUser
ROLES =(
('hr', 'HR'),
('employee', 'Employee'),
('master', 'Master')
)
class Company(models.Model):
name = models.CharField(max_length=100, null=False, blank=False)
[...] # your other fields
class User(AbstractUser):
company = models.ForeignKey(on_delete=models.PROTECT, null=False, blank=False)
role = models.CharField(max_length=10, choices=ROLES, blank=False, null=False)
pass
您可以为每个用户分配一个角色和公司。
然后过滤查询集
User.objects.filter(company=request.user.company)
另一种方法如果您只想列出/编辑公司的员工,则可以创建员工类如果不需要,请从用户中删除角色,然后将公司添加到员工类别中
class Employee(models.Model):
company = models.ForeignKey(on_delete=models.PROTECT, null=False, blank=False)
first_name = models.CharField(max_length=30, blank=False, null=False)
last_name = models.CharField(max_length=30, blank=False, null=False)
[...] #aditional fields
答案 1 :(得分:0)
实现目标的一种更有机的方法是使用会话并为您的视图定义装饰器。例如,我想确保一个用户不能访问另一个用户的数据。所以我定义了一个装饰器来做这个检查。
在我的用例中,不允许匿名会话。为了确保用户只能访问他们的仪表板,我定义了一个 UserSession 模型并在用户登录时填充 UserSession。
我定义了一个装饰器,用于检查会话是否存在于 Usersession 中。如果存在,则进行检查以确保 UserSession 中的用户和请求中的用户相同。如果它们匹配,则调用视图。如果不是,则发送错误响应。我正在使用 JsonResponse。您可以根据您的用例发送适当的响应。
对于每个视图,我都使用这个装饰器。根据您的用例创建尽可能多的装饰器并用它们装饰您的视图。
对于我的用例,我在 models.py 中定义了一个 UserSession,如下所示:
from django.contrib.sessions.models import Session
from django.contrib.auth import get_user_model
class UserSession(models.Model):
user = models.ForeignKey(get_user_model(), on_delete = models.CASCADE)
session = models.ForeignKey(Session, on_delete = models.CASCADE)
我在我的应用程序目录中创建了一个 decorators.py 并定义了 is_user_logged_in 方法
from functools import wraps
from your_app.models import UserSession
from django.contrib.sessions.models import Session
from django.http import JsonResponse
def is_user_logged_in(function):
@wraps(function)
def wrapper(request, *args, **kwargs):
response_data={}
try:
userSession=UserSession.objects.get(
session__session_key=request.session.session_key
)
except UserSession.DoesNotExist:
response_data['status'] = 'token_invalid'
return JsonResponse(response_data)
if userSession.user == request.user:
return function(request, *args, **kwargs)
else:
response_data['status'] = 'token_user_invalid'
return JsonResponse(response_data)
return wrapper
我用 is_user_logged_in 装饰器装饰了我的视图,如下所示:
my_decorators = [is_user_logged_in, any_other_decorator]
@method_decorator(my_decorators, name='dispatch')
class ProfileView(View):
def get(self, request):
#Do your thing
def post(self, request):
#Do your thing
参考文献: