如何让用户关联到另一个模型 DRF。 ValueError:精确查找的 QuerySet 值必须使用切片限制为一个结果

Posted

技术标签:

【中文标题】如何让用户关联到另一个模型 DRF。 ValueError:精确查找的 QuerySet 值必须使用切片限制为一个结果【英文标题】:How to get the user associated to another model DRF. ValueError: The QuerySet value for an exact lookup must be limited to one result using slicing 【发布时间】:2021-11-07 23:48:08 【问题描述】:

我想检查卡号是否存在,然后让关联的用户使用该卡号。一个用户可以有多个卡号。如何过滤从输入的卡号中获取用户?

型号:

类 CustomUser(AbstractBaseUser, PermissionsMixin):

email = models.EmailField(
    verbose_name="Email Field", max_length=60, unique=True)
dateJoined = models.DateTimeField(
    verbose_name="Date Joined", auto_now_add=True)
last_login = models.DateTimeField(verbose_name="Last Login", auto_now=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_superuser = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
is_verified = models.BooleanField(default=False)

# Parameters that we want to know about the user
first_name = models.CharField(verbose_name="First Name", max_length=100)
last_name = models.CharField(verbose_name="Lasst Name", max_length=100)



USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name', 'last_name']

objects = CustomUserManager()

def __str__(self):
    return self.email

def tokens(self):
    refresh = RefreshToken.for_user(self)
    return 
        'refresh': str(refresh),
        'access': str(refresh.access_token)
    

def has_perm(self, perm, obj=None):
    return self.is_superuser

def has_module_pers(self, app_label):
    return True

类cardModel(models.Model):

user = models.ForeignKey(CustomUser, related_name='card_numbers',null = True, blank=True, on_delete=models.CASCADE)

card_number = models.IntegerField(
    verbose_name="Card Number", blank=True, null=True, default=None, unique=True)

def __int__(self):
    return self.card_number

序列化器:

类 CheckCard(serializers.Serializer):

card_number = serializers.IntegerField(write_only=True)
class Meta:
    fields = ['card_number','user']
    read_only_fields = ['user']

观看次数:

类 CheckCardAPI(APIView): permission_classes = [AllowAny] serializer_class= 支票卡

def post(self,request,*args,**kwargs):
    serializer = self.serializer_class(data=request.data)
    card_number = request.data.get('card_number','')

    if cardModel.objects.filter(card_number=card_number).exists():
        user = User.objects.filter(card_numbers=card_number)
        tokens, created = Token.objects.get_or_create(user=user)
        return Response('token':tokens.key,status=status.HTTP_200_OK)
    else: 
        return Response('error':'card is not registered',status=status.HTTP_404_NOT_FOUND)

【问题讨论】:

【参考方案1】:

您正在根据卡号查找单个用户,因此您的查询

user = User.objects.filter(card_numbers=card_number)

返回一个列表。也许你需要使用

user = User.objects.get(card_numbers=card_number) 

获取对象或使用

value_list(id, flat=True)

带过滤器。

【讨论】:

我试过 user = User.objects.get(card_numbers=card_number) 但它也不起作用,我收到错误 Accounts.models.CustomUser.DoesNotExist: CustomUser 匹配查询不存在。即使我知道该用户的 card_number 已成功生成 等待上述查询只是为了解释如何获取单个对象。这不是正确的查询。 尝试使用 User.objects.get(id=cardModel.objects.get(card_numbers=card_number).user) 或稍作修改以完全匹配您正在查找的内容。检查 cardModel.objects.get(card_numbers=card_number).user 是否正在返回您的用户 ID。 想通了。不得不去:pk = cardModel.objects.get(card_number=card_number) user = User.objects.get(card_numbers=pk) pk = cardModel.objects.get(card_number=card_number) 只会给你 CardModel 对象。并且 pk = cardModel.objects.get(card_number=card_number).user 将为您提供与该对象相关的用户。最后标记 .user 。你不能写 User.objects.get(card_numbers=pk) 因为 User 模型没有卡号字段。但是你可以写 User.objects.get(id=pk) 因为用户模型有 id 字段,而且 pk 最后应该有一个 .user。

以上是关于如何让用户关联到另一个模型 DRF。 ValueError:精确查找的 QuerySet 值必须使用切片限制为一个结果的主要内容,如果未能解决你的问题,请参考以下文章

如何在 DRF 中序列化自定义用户模型

如何从父模型关联到另一个模型

如何在 DRF + django-rest-auth 中使用自定义用户模型保存注册时的额外字段

无法使用用户名/密码登录令牌端点:drf 令牌身份验证和自定义用户模型,Django

DRF如何通过外键公司过滤用户和产品?

WPF中如何实现将一个窗口的对象关联到另一个窗口?