Установить пользовательское разрешение на модель в Django
Мне нужно установить некоторые права на модель в Django, потому что у меня есть некоторые операции в DRF и мне нужно знать, есть ли у пользователя права на это или нет. Мои модели :
class Device(models.Model):
type = models.ForeignKey(Type, on_delete=models.CASCADE)
name = models.fields.CharField(max_length=36)
ip = models.CharField(max_length=64, blank=True)
password = models.CharField(max_length=62, blank=True)
mac = models.CharField(max_length=17, blank=True)
description = models.fields.TextField(max_length=600, blank=True)
users = models.ManyToManyField(User,'users_device',through="UserMeta")
status = models.BooleanField(default=False)
def __str__(self):
return self.name
class UsersMeta(models.Model):
type_choices = [
("owner",'owner'),
('user','user'),
('admin','admin')
]
user = models.ForeignKey(User,on_delete=models.DO_NOTHING,related_name='UserMeta_devices')
device = models.ForeignKey(Device,models.CASCADE,related_name='UserMeta_device')
type = models.CharField(max_length=8,choices=type_choices)
token = models.UUIDField(default=uuid4,
editable=False,
unique=True)
join_time = models.DateTimeField(auto_now_add=True)
last_activate = models.DateTimeField(null=True,blank=True)
Мне нужен доступ с определенными разрешениями к модели Device depending на модели User в модели UserMeta. В UserMeta у меня есть несколько разрешений выбора, например: owner, admin, user, поэтому мне нужно сказать, имеет ли этот пользователь разрешение OWNER, или что-то еще может сделать это или нет.
Я не знаю правильно это или нет, если вы знаете, пожалуйста, скажите мне
Вы можете определить пользовательское разрешение в DRF следующим образом:
permissions.py:
from rest_framework.permissions import BasePermission
class IsOwner(BasePermission):
"""
Allows access only to owners
"""
def has_permission(self, request, view):
user_meta = UsersMeta.objects.filter(user=request.user).first()
return True if user_meta and user_meta.type == "owner" else False
Использование:
from rest_framework.views import APIView
from rest_framework.response import Response
from .permissions import IsOwner
class YourView(APIView):
permission_classes = (IsOwner,)
def get(self, request, format=None):
content = {
'status': 'owner users'
}
return Response(content)