2017-10-22 13 views
3

私はdjango 1.11.5とpython 3.5を使用しています。django/rest:シリアライザを1つのフィールドだけで使用できますか?

rest-frameworkを使用して、uidの患者を検索したいと思います。

フィールドを1つだけ持つシリアライザを使用しようとすると、エラーTheフィールドoption must be a list or tuple or "__all__". Got str.が返されます。

ユーザを検索するフィールドが1つしかない場合はありますか?

serializers.py

class GetUserSerializer(serializers.ModelSerializer): 
    id = serializers.CharField(source='uid') 

    class Meta: 
     model = User 
     fields = ('id') 

views.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) 

あなたはフィールドオプションでタプルを指定する必要がmodels.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 

答えて

1

fields = ('id',) 

もしあなたがコンマ,を追加しないと、Pythonは文字列として('id')を見ます。そのため、エラーメッセージにGot str.が表示されます。

あなたはそれをテストすることができます。

>>> type(('id',)) 
<type 'tuple'> 
1

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

をあなたはコンマが必要で一つの要素とのタプルを指定する必要があります。​​。

関連する問題