【发布时间】:2018-01-23 18:33:38
【问题描述】:
这是一个基本的api,我有3种用户->管理员、公司、员工。
管理员可以查看、编辑和删除所有视频,公司可以查看和删除其员工,员工只能看到其公司更新的视频。
所以每个公司都会有一个管理面板,他们可以上传培训视频和注册员工,所以每个公司都有自己的面板,他们看不到其他公司。
我是否需要创建自定义用户模型才能做到这一点?我将如何创建该模型,如何设置这些权限?
如何管理公司和员工可以访问或不能访问的注册表单、登录名、网址
我的models.py:
from django.db import models
from django.utils import timezone
# Create your models here.
class Company(models.Model):
user = models.ForeignKey('auth.User', on_delete=models.DO_NOTHING)
empresa_nome = models.CharField(max_length=100, default='')
razao_social = models.CharField(max_length=100, default='')
cnpj = models.CharField(max_length=18, default='')
def __str__(self):
return self.empresa_nome
class Employee(models.Model):
empresa = models.ForeignKey(Company, on_delete=models.DO_NOTHING, related_name='employees')
user = models.ForeignKey('auth.User', on_delete=models.DO_NOTHING)
phone = models.CharField(max_length=20)
def __str__(self):
return self.phone
class Test(models.Model):
company = models.ForeignKey(Company, on_delete=models.DO_NOTHING, related_name='treinamentos')
user = models.ForeignKey('auth.User', on_delete=models.DO_NOTHING)
categoria = models.CharField(max_length=100)
created_at = models.DateTimeField(default=timezone.now)
updated_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.categoria
class Video(models.Model):
video = models.ForeignKey(Test, on_delete=models.DO_NOTHING, related_name='video')
user = models.ForeignKey('auth.User', on_delete=models.DO_NOTHING)
url = models.CharField(max_length=150)
ordem = models.IntegerField(null=False)
pergunta = models.CharField(max_length=250)
certo = models.CharField(max_length=250)
errado = models.CharField(max_length=250)
created_at = models.DateTimeField(default=timezone.now)
updated_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.categoria
serializers.py:
from django.contrib.auth.models import User
from rest_framework import serializers
from .models import Company, Employee, Test, Video
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'email', 'is_staff')
class EmployeeSerializer(serializers.ModelSerializer):
class Meta:
model = Employee
exclude = []
class VideoSerializer(serializers.ModelSerializer):
class Meta:
model = Video
exclude = []
class TestSerializer(serializers.ModelSerializer):
video = VideoSerializer(read_only=True, many=True)
class Meta:
model = Test
fields = ('id', 'categoria', 'video', 'created_at', 'updated_at')
exclude = []
class CompanySerializer(serializers.ModelSerializer):
employees = EmployeeSerializer(read_only=True, many=True)
treinamentos = TestSerializer(read_only=True, many=True)
#user_obj = UserSerializer(read_only=True)
class Meta:
model = Company
fields = ('id', 'empresa_nome', 'razao_social', 'cnpj', 'employees', 'treinamentos')
exclude = []
urls.py
from django.conf.urls import url, include
from django.contrib import admin
from rest_framework import routers, viewsets
from restcompanies.views import UserViewSet, CompanyViewSet, EmployeeViewSet, TestViewSet, VideoViewSet
router = routers.DefaultRouter()
router.register(r'users', UserViewSet)
router.register(r'companies', CompanyViewSet)
router.register(r'employees', EmployeeViewSet)
router.register(r'tests', TestViewSet)
router.register(r'videos', VideoViewSet)
app_name = 'restcompanies'
urlpatterns = [
url(r'^', include(router.urls)),
url(r'^admin/', admin.site.urls),
url(r'^api-auth/', include('rest_framework.urls', namespace='restcompanies')),
]
【问题讨论】:
-
你能分享一下你到目前为止的尝试吗?
-
@arjun27 我已经用一些代码更新了问题
标签: django python-3.x rest permissions django-rest-framework