Django Rest框架的ModelSerializer缺少user_id字段导致KeyError

问题描述 投票:0回答:1

当我在序列化器上调用

ModelSerializer
时,我的
KeyError
收到
.data
,我不知道如何正确修复此错误。

Knox 的 AuthToken 模型看起来像这样

class AuthToken(models.Model):

    objects = AuthTokenManager()

    digest = models.CharField(
        max_length=CONSTANTS.DIGEST_LENGTH, primary_key=True)
    token_key = models.CharField(
        max_length=CONSTANTS.TOKEN_KEY_LENGTH, db_index=True)
    user = models.ForeignKey(User, null=False, blank=False,
                             related_name='auth_token_set', on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    expiry = models.DateTimeField(null=True, blank=True)

    def __str__(self):
        return '%s : %s' % (self.digest, self.user)

我创建了一个模型序列化器

class AuthTokenResponseSerializer(serializers.ModelSerializer):
    class Meta:
        model = AuthToken
        fields = "__all__"

但是,当我创建

token_serializer
时,我收到此错误

>> token_serializer.data
*** KeyError: "Got KeyError when attempting to get a value for field `user` on serializer `AuthTokenResponseSerializer`.\nThe serializer field might be named incorrectly and not match any attribute or key on the `dict` instance.\nOriginal exception text was: 'user'."

我认为我收到此错误是因为创建

token_serializer
时,它缺少
user
键。我可以看到有一个
user_id
键,但没有
user

(Pdb) token_serializer
AuthTokenResponseSerializer(context={'request': <rest_framework.request.Request: POST '/auth/token/'>}, data={'_state': <django.db.models.base.ModelState object>, 'digest': '6b82ac8776113db376d8938a641c3ebdea573b4ab49cb648c171fccc7f4a517e6450cebb21682e26f36562cf7b659f5089957ba49e99c096ebc9eaaa93ab0e53', 'token_key': '872832f8', 'user_id': 34, 'created': None, 'expiry': datetime.datetime(2024, 5, 11, 9, 17, 2, 540546, tzinfo=datetime.timezone.utc)}, partial=True):
    digest = CharField(max_length=128, validators=[<UniqueValidator(queryset=AuthToken.objects.all())>])
    token_key = CharField(max_length=8)
    created = DateTimeField(read_only=True)
    expiry = DateTimeField(allow_null=True, required=False)
    user = PrimaryKeyRelatedField(queryset=User.objects.all())

我的用户模型

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import (
    AbstractBaseUser,
    PermissionsMixin,
    BaseUserManager,
)
from django.utils.translation import gettext_lazy as _
from phonenumber_field.modelfields import PhoneNumberField

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(
        verbose_name=_("email address"), unique=True, max_length=255
    )
    password = models.CharField(
        max_length=128, null=True
    ) 
    first_name = models.CharField(max_length=128, null=True)
    last_name = models.CharField(max_length=128, null=True)
    phone_number = PhoneNumberField(null=True, blank=True)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(default=timezone.now)
    updated_at = models.DateTimeField(default=timezone.now)
python django django-rest-framework django-serializer django-rest-knox
1个回答
0
投票
  • 您遇到的 KeyError 发生是因为序列化器是 期望传递给它的数据中有一个用户字段,但是数据 您提供的只有一个 user_id 键。这种差异可能会出现 如果您要序列化的数据来自不存在的来源 与您的 AuthTokenResponseSerializer 期望的结构完全匹配。

    要解决此问题,您可以调整 AuthTokenResponseSerializer 通过将 user_id 显式映射到 用户字段。这可以通过使用 PrimaryKeyRelatedField 来实现 您的序列化器并指定源属性:

AuthTokenResponseSerializer:

from rest_framework import serializers

class AuthTokenResponseSerializer(serializers.ModelSerializer):
    user = serializers.PrimaryKeyRelatedField(
        queryset=User.objects.all(),
        source='user_id'  # Map the `user_id` field in incoming data to the `user` relationship
    )

    class Meta:
        model = AuthToken
        fields = "__all__"
© www.soinside.com 2019 - 2024. All rights reserved.