【问题标题】:Django: TokenAuthentication and AbstractBaseUser ErrorsDjango:TokenAuthentication 和 AbstractBaseUser 错误
【发布时间】:2015-09-04 15:37:22
【问题描述】:

我正在使用 Django 1.8.4 和 Django rest 框架 3.2.3。因为我想覆盖“用户名”字段,所以我不得不使用“AbstractBaseUser” 使用的模型是:

class Users(AbstractBaseUser):
    username = models.EmailField(max_length=75, null=False, blank=False, unique=True)
    first_name = models.CharField(max_length=50, null=True, blank=True)
    last_name = models.CharField(max_length=70, null=True, blank=True)
    tel_number = models.IntegerField(null=True, blank=True)
    address = models.CharField(max_length=250, null=True, blank=True)
    user_image = models.ImageField(upload_to='user_avatar', blank=True, null=True)
    date_time = models.DateTimeField(auto_now=True, null=True, blank=True)
    activated = models.BooleanField(default=False)

    def __unicode__(self):
        return self.username

    class Meta:
        ordering = ['-id']

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['tel_number']

现在我想用新令牌创建新用户:

if request.method == 'POST':
    serializer = UserSerializer(data=request.data)
    data = {}
    if serializer.is_valid():
        user = serializer.save()
        token, created = Token.objects.get_or_create(user=user)
        data['token'] = token
        data = serializer.data
        return Response(data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我的序列化器是:

class UserSerializer(serializers.ModelSerializer):
class Meta:
    model = Users
    fields = ('id', 'username', 'password', 'first_name', 'last_name', 'tel_number', 'address', 'user_image')

但我在“创建令牌行”时收到此错误:

Cannot query "a@gmail.com": Must be "User" instance.

【问题讨论】:

  • 请出示您的序列化程序。
  • 我正在添加序列化程序,请帮助我
  • 您正在使用抽象用户模型,您在设置中设置了什么AUTH_USER_MODEL

标签: python django django-models django-rest-framework


【解决方案1】:

您没有将用户实例传递给 Token。 你可以试试这个:

在 routers.py 中

from rest_framework import routers
from .viewsets import UserSeralizerViewSets
router = routers.DefaultRouter()
router.register(r'users', UserSeralizerViewSets)

在 urls.py 中

from .routers import router
urlpatterns = [
    url(r'^', include(router.urls)),
]

在viewsets.py中

class UserSeralizerViewSets(viewsets.ModelViewSet):
    serializer_class = UserSeralizer
    queryset = Users.objects.all()

   def create(self, request, *args, **kwargs):
       data = {}
       serializer = self.get_serializer(data=request.data)
       serializer.is_valid(raise_exception=True)
       user = serializer.save()
       token, created = Token.objects.get_or_create(user=user)
       data['token'] = token.key
       return Response(data, status=status.HTTP_201_CREATED)

【讨论】:

    【解决方案2】:

    seenu s 的答案很好,但我在 settings.py 中使用了这一行并且有效。

         AUTH_USER_MODEL = 'users.Users'
    

    Users.Users 是 (myappname.mymodelname)
    我在 Django 文档上找到了这个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2015-07-11
      相关资源
      最近更新 更多