代码之家  ›  专栏  ›  技术社区  ›  zinon

django/rest:我可以有一个只有一个字段的序列化程序吗?

  •  5
  • zinon  · 技术社区  · 7 年前

    我正在使用 django 1.11.5 和python 3.5。

    使用 rest-framework ,我想搜索一位患有 uid .

    The 领域 option must be a list or tuple or "__all__". Got str. .

    只有一个字段来搜索用户,有什么解决方案吗?

    class GetUserSerializer(serializers.ModelSerializer):
        id = serializers.CharField(source='uid')
    
        class Meta:
            model = User
            fields = ('id')
    

    意见。py公司

    class GetUser(CreateAPIView):
        permission_classes = ()
        serializer_class = GetUserSerializer
    
        def get(self, request):
            serializer = GetUserSerializer(data=request.data)
            # Check format and unique constraint
            if not serializer.is_valid():
                return Response(serializer.errors, \
                                status=status.HTTP_400_BAD_REQUEST)
            data = serializer.data
    
    
            if User.objects.filter(uid = data['id']).exists():
                user = User.objects.get(uid = data['id'])
                resp = {"user":{"uid":user.uid, "firstname":user.firstname, "yearofbirth": user.yearofbirth, \
                                "lastnames": user.lastname, "othernames": user.othernames}}
                return Response(resp, status=status.HTTP_200_OK)
    
            else:
    
                resp = {"error": "User not found"}
                return Response(resp, status=status.HTTP_404_NOT_FOUND)
    

    模型。py公司

    class User(models.Model):
        uid = models.CharField(max_length=255, unique=True,default="0")
        firstname = models.CharField(max_length=255)
        lastname = models.CharField(max_length=255, blank=True)
        othernames = models.CharField(max_length=255, blank=True)
        yearofbirth = models.SmallIntegerField(validators=[MinValueValidator(1900),
                                               MaxValueValidator(2018)], null = False
    
    2 回复  |  直到 7 年前
        1
  •  9
  •   vabada    7 年前

    您需要在字段选项中指定元组:

    fields = ('id', )
    

    如果不加逗号 , python看到 ('id') 作为字符串。这就是为什么你会看到 Got str.

    >>> type(('id'))
    <type 'str'>
    

    vs

    >>> type(('id',))
    <type 'tuple'>
    
        2
  •  2
  •   asthasr    7 年前

    您需要使用一个元素指定元组,该元素需要逗号: ('uid',) .