最近,我逐行完整地回顾了我之前在Django中的代码。我有一个小问题。
我倾向于将ORM方法放到VIEW,而不是序列化程序。例如,我想将User.objects.create_user
变成APIView类,如下所示。
class SignUp(APIView):
def post(self, request):
serializer = SignUpSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
User.objects.create_user(
email=serializer.validated_data['email'],
password=serializer.validated_data['password1'],
first_name=serializer.validated_data['first_name'],
last_name=serializer.validated_data['last_name'],
)
return Response(data=serializer.data, status=status.HTTP_201_CREATED)
但是,我发现许多代码如下所示覆盖了序列化程序中的create方法。
class SignUpSerializer(serializers.ModelSerializer):
password1 = serializers.CharField(write_only=True)
password2 = serializers.CharField(write_only=True)
class Meta:
model = User
fields = ('pk', 'email', 'password1', 'password2', 'first_name', 'last_name')
def validate(self, data):
if data['password1'] != data['password2']:
raise serializers.ValidationError('password should match')
return data
def create(self, validated_data):
return self.Meta.model.objects.create_user(
email=validated_data['email'],
password=validated_data['password2'],
first_name=validated_data['first_name'],
last_name=validated_data['last_name']
)
我个人认为序列化器更像是数据转换器,而不是再现器。
我很感激您能够就这个小问题分享您的看法:)
p.s我说这是一个小问题,因为我知道这可能是一个品味问题。