【问题标题】:Django objects.get(): The QuerySet value for an exact lookup must be limited to one result using slicingDjango objects.get():精确查找的 QuerySet 值必须限制为使用切片的一个结果
【发布时间】:2021-04-23 06:52:43
【问题描述】:

我正在尝试根据电子邮件地址检查数据库中是否存在用户,因此我收到了电子邮件,如果该电子邮件存在,我想返回该用户的用户名以及其他一些数据。

我正在使用 objects.get() 方法来执行此操作,但我不断收到此错误。

对其进行了一些搜索,一些解决方案建议进行过滤并返回 .first() 对象或代替 email=email,建议放置 email=email[0],但这两种方法都结束了给我一个空数组作为回应。

这是我的 Views.py:

class CheckEmailView(APIView):
permission_classes = [AllowAny]

def post(self, request, *args, **kwargs):
    serializer = CheckEmailSerializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    email = Account.objects.filter(email=serializer.data['email'])
    if email.exists():
        username = Account.objects.get(email=email)
        return Response({'is_member': True, 'username': username})
    else:
        return Response({'is_member': False})

【问题讨论】:

  • 你为什么要对Account进行两次查询?您的过滤器是否返回结果?如果是这样,您可以使用email下的QuerySet
  • @PacketLoss 如果电子邮件存在,则第一个查询返回,第二个查询旨在返回现有用户的用户名,但会抛出该错误。并且过滤器返回结果是的。但我不知道如何使用电子邮件下的查询集来获取用户名。能详细点吗?
  • 尝试将.first() 添加到过滤器的末尾,然后添加print(email.username)
  • @PacketLoss 成功了。太感谢你了????
  • 太棒了!我已添加评论作为答案。如果它有助于随时接受答案,那么它可能会在未来帮助其他人。欢迎来到 SO!

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


【解决方案1】:

当您要访问同一数据集中的其他列时,无需对Account 进行两次查询。

只需从初始过滤器中调用您想要的字段。

应该注意,过滤器可以返回多行(如果存在),如果您想确保只返回第一行,请将.first() 添加到您的过滤器中。

现在您可以调用以下命令返回用户名。

email.username

【讨论】:

    猜你喜欢
    • 2019-10-02
    • 2019-05-26
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多