जब मैं Django Rest Framework की बात करता हूं तो मैं सर्वोत्तम प्रथाओं के बारे में सोच रहा था। मैं प्रति उपयोगकर्ता अलग-अलग धारावाहिकों (कर्मचारियों बनाम खाता मालिक बनाम किसी और) और HTTP विधि के उपयोग के माध्यम से किसी खाते पर कुछ विशेषताओं को बदलने के लिए पहुंच सीमित कर रहा हूं, लेकिन मुझे लगता है कि यह बहुत अवांछित है।Django आराम फ्रेमवर्क: सर्वोत्तम प्रथाओं?
क्या यह किसी ऑब्जेक्ट के विभिन्न फ़ील्ड को बदलने के लिए "अनुमतियां" को अलग करने का अपना काम पूरा करने का सबसे अच्छा तरीका है? या क्या वर्तमान में इस तरीके से मैं जो कर रहा हूं उसे पूरा करने के लिए एक बेहतर और अधिक पागल तरीका है?
नीचे दिए गए कोड के साथ कोई भी और सभी आलोचना स्वीकार की जाती है, क्योंकि मुझे लगता है कि मैंने कुछ कोनों को काट दिया है।
बहुत बहुत धन्यवाद।
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()]