Tôi đã tự hỏi về thực tiễn tốt nhất khi nói đến Django Rest Framework. Tôi đã hạn chế quyền truy cập vào việc thay đổi các thuộc tính nhất định trên tài khoản thông qua việc sử dụng các trình tuần tự khác nhau cho mỗi người dùng (nhân viên so với chủ sở hữu tài khoản so với bất kỳ ai khác) và phương pháp HTTP, nhưng tôi cảm thấy như thế này quá khó hiểu.Django Rest Framework: Các phương pháp hay nhất?
Đây có phải là cách tốt nhất để hoàn thành nhiệm vụ tách "quyền" của tôi để thay đổi các trường khác nhau của đối tượng không? Hoặc là có một cách tốt hơn và nhiều hơn nữa pythonic để thực hiện những gì tôi đang làm theo cách này hiện nay?
Bất kỳ và tất cả những lời chỉ trích với mã bên dưới đều được chấp nhận, vì tôi cảm thấy như tôi đã cắt một số góc.
Cảm ơn rất nhiều.
from rest_framework import serializers, viewsets
from rest_framework.permissions import SAFE_METHODS
from accounts.models import User
from cpapi.permissions import *
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('id', 'url', 'username', 'password')
write_only_fields = ('password',)
def restore_object(self, attrs, instance=None):
user = super(UserSerializer, self).restore_object(attrs, instance)
if 'password' in attrs.keys():
user.set_password(attrs['password'])
return user
class UserDetailsSerializer(UserSerializer):
class Meta(UserSerializer.Meta):
fields = ('id', 'url', 'username', 'password', 'email')
class UserListSerializer(UserSerializer):
class Meta(UserSerializer.Meta):
fields = ('id', 'url', 'username')
class UserWithoutNameSerializer(UserSerializer):
class Meta(UserSerializer.Meta):
fields = ('id', 'url', 'password', 'email')
class UserViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
"""
serializer_class = UserSerializer
model = User
def get_serializer_class(self): # Modify to allow different information for different access (userlist vs staff)
serializer_class = self.serializer_class
if 'List' in self.get_view_name():
serializer_class = UserListSerializer
elif self.request.method in ['PUT', 'PATCH']:
serializer_class = UserWithoutNameSerializer
elif self.get_object() == self.request.user or self.request.user.is_staff:
serializer_class = UserDetailsSerializer
return serializer_class
def get_permissions(self):
if self.request.method in SAFE_METHODS or self.request.method == 'POST':
return [AllowAny()]
elif self.request.method == 'DELETE':
return [IsAdminUser()]
else:
return [IsStaffOrTargetUser()]