次要问题:将User.objects.create_user放入DRF的更好位置在哪里?

时间:2018-01-05 04:56:14

标签: django django-rest-framework

最近,我逐行完整地回顾了我之前在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我说这是一个小问题,因为我知道这可能是一个品味问题。

0 个答案:

没有答案