我应该为POST和GET请求编写两个不同的序列化程序吗?

时间:2015-07-28 12:04:10

标签: python django api serialization django-rest-framework

这是MODEL:

class Device (models.Model):
    name = models.CharField(max_length = 30)
    device_id = models.CharField(max_length = 100, unique = True)
    organization = models.ForeignKey(Organization)

这是SERIALIZER:

class DeviceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Device
        fields = ['id','device_id', 'organization']
    def create(self,validated_data):
        validated_data.__setitem__('name', names.get_full_name())
        return Device.objects.create(**validated_data)

这是API:

class DeviceAPI(APIView):
    def post(self,request,format=None):
        serializer = DeviceSerializer(data = request.data)
        if serializer.is_valid():
            serializer.save()
            return JSONResponse(serializer.data , status = 201)
        return JSONResponse(serializer.errors, status = 400)
    def get(self,request,format=None):
       # --------------------------------- #
       # ---- WHAT to write here ??? ----- #
       # --------------------------------- #
       return JSONResponse(serializer.data, status = 200)   

我想要这个:

if method.request == POST:
   pass  # get post data and create new device  // it's work 
if method.request == GET:
   pass  # receive data (device_id) and if it's exists then send it's id

我可以只使用一个串行器吗?或者我应该写第二个(对于一个方法 - 一个串行器)

谢谢! ! !

1 个答案:

答案 0 :(得分:0)

执行此操作的最佳方法是只使用一个序列化程序,但要确保它具有正确的注释,以便哪些字段是只读的,哪些字段是可读写的。

如果您使用的是简单的ModelSerializer,它将如下所示:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = [ 'username', 'first_name', 'last_name', 'email' ]
        read_only_fields = [ 'username' ]

这会创建一个序列化程序,输出fields参数中列出的四个字段,但只有最后三个字段可以使用序列化程序进行编辑。

然后只需使用ModelViewSet(或其他一些ViewSet),让REST Framework为您构建所有方法,而不是手动编写所有方法。

在某些情况下,您需要一个不同的序列化程序来创建用户(因为用户需要在首次创建帐户时选择用户名)...为此,您可以使用Django REST Framework show multiple forms on HTML view处的示例