Django rest框架'tuple'对象没有属性'key'

may*_*yur -1 python django rest frameworks

我使用django框架和REST框架JWT Auth进行令牌生成

序列化器

from django.contrib.contenttypes.models import ContentType
from django.contrib.auth import get_user_model
from django.db.models import Q
from django.contrib.auth.models import User

from rest_framework import serializers
from company.models import Employee

from rest_framework.authtoken.models import Token

from rest_framework.serializers import(
    ValidationError,


    ) 

class UserLoginSerializer(serializers.ModelSerializer):
    token = serializers.CharField(allow_blank = True , read_only = True)
    username = serializers.CharField(required = False , allow_blank=True)
    email = serializers.EmailField(label="Email Adress",required = False, allow_blank=True)
    class Meta:
        model = User
        fields = [
            'username',
            'email',
            'password',
            'token',


        ]
        extra_kwargs ={"password":
                        {"write_only":True  
                        }
        }
    def validate(self, data):
        user_obj = None
        email = data.get('email', None)
        username = data.get("username", None)
        password = data["password"]
        if not email and not username:
                raise ValidationError("A username or email is required to login")

        user=User.objects.filter(
                Q(email=email)|
                Q(username=username)

            ).distinct()
        user = user.exclude(email=None)
        if user.exists() and user.count() == 1 :
            user_obj = user.first()
        else:
            raise ValidationError("username/email not valid.")

        if user_obj:
            if not user_obj.check_password(password):
                raise ValidationError("Incorrect credentials please try again")


        token = Token.objects.get_or_create(user=user_obj)
        #print token.key        
        data["token"] = token.key


        return data
Run Code Online (Sandbox Code Playgroud)

错误在data["token"] = token.key这一行,即 'tuple' object has no attribute 'key'

url.py

 url(r'^api/emp/$', x.EmployeeList.as_view(), name='api-Emp'),
 #url(r'^api/emp/(?P<pk>\d+)/$', x.EmployeeDetailAPIView.as_view(), name='api-Detail'),
 url(r'^api/emp/(?P<pk>[\w]+)/$', x.EmployeeDetailAPIView.as_view(), name='api-Detail'),
 #url(r'^(?P<pk>\d+)/$', x.EmployeeDetailAPIView.as_view(), name='api-Detail'),
 url(r'^api/emp/(?P<pk>[\w]+)/update/$', x.EmployeeUpdateAPIView.as_view(), name='emp-api-update'),
 url(r'^api/emp/(?P<pk>[\w]+)/delete/$', x.EmployeeDeleteAPIView.as_view(), name='emp-api-delete'),
 url(r'^create/emp/$', x.EmployeeCreateAPIView.as_view(), name='emp-api-create'),
 url(r'^api/user/$', x.UserDeatilAPIView.as_view(), name='api-user'),


 #register UserLoginAPIView
 url(r'^register/$', x.UserCreateAPIView.as_view(), name='register'),
 url(r'^login/$', x.UserLoginAPIView.as_view(), name='api-login'),

 #jwt
 url(r'^api/token/auth/', obtain_jwt_token),
 url(r'^api/token/refresh/', refresh_jwt_token),
 url(r'^api/token/verify/', verify_jwt_token),
Run Code Online (Sandbox Code Playgroud)

jwt的最后3个链接验证,刷新和验证工作正常,但自定义序列化程序不起作用。给我一些建议,如果我做错了!

Dan*_*man 5

get_or_created返回对象的元组和显示是否已创建的布尔值。由于您似乎并不在乎第二个,您可以将其分配给一个临时变量。

token, created = Token.objects.get_or_create(user=user_obj)
Run Code Online (Sandbox Code Playgroud)