Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我应该为POST和GET请求编写两个不同的序列化程序吗?_Python_Django_Api_Serialization_Django Rest Framework - Fatal编程技术网

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

Python 我应该为POST和GET请求编写两个不同的序列化程序吗?,python,django,api,serialization,django-rest-framework,Python,Django,Api,Serialization,Django Rest Framework,以下是模型: class Device (models.Model): name = models.CharField(max_length = 30) device_id = models.CharField(max_length = 100, unique = True) organization = models.ForeignKey(Organization) 下面是序列化程序: class DeviceSerializer(serializers.ModelS

以下是模型:

class Device (models.Model):
    name = models.CharField(max_length = 30)
    device_id = models.CharField(max_length = 100, unique = True)
    organization = models.ForeignKey(Organization)
下面是序列化程序:

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
我可以只使用一个序列化程序还是应该第二次编写(对于一个方法-一个序列化程序)


谢谢

最好的方法是只使用一个序列化程序,但要确保它对哪些字段是只读的,哪些字段是读写的都有正确的注释

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

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = [ 'username', 'first_name', 'last_name', 'email' ]
        read_only_fields = [ 'username' ]
这将创建一个序列化程序,输出
字段
参数中列出的四个字段,但使用序列化程序只能编辑最后三个字段

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


在某些情况下,您可能需要一个不同的序列化程序来创建用户(因为用户在首次创建帐户时需要一种选择用户名的方法)。。。为此,您可以使用处的示例。

还请注意,如果某个字段在模型中标记为“editable=False”,则该字段在序列化程序中已经是只读的,您不需要将其包含在只读字段中。在这种情况下,它将可编辑以进行创建,而不需要其他序列化程序。