【问题标题】:get() returned more than one TenantUserget() 返回多个 TenantUser
【发布时间】:2019-06-02 22:57:12
【问题描述】:

我的意见.py

@api_view(['POST'])
@permission_classes((AllowAny,))
@csrf_exempt
def transfer_tokens(request, domain):
    """
        transfer tokens
    """
    email = request.data['to_email']
    # user_id = request.data['connected']
    user = request.user
    coins_to_be_transferred = request.data["coins"]
    to_user = User.objects.get(email=email)
    user_id = to_user.id
    to_tuser = TenantUser.global_manager.get(user=user_id)
    tenantuser = TenantUser.global_manager.get(email=user.email)
    if to_user and user.kyc_done and to_user.kyc_done and coins_to_be_transferred >= 0:
        if user.coins >= coins_to_be_transferred:
            PoolHistory._default_manager.create(
                tenant=tenantuser, coins=coins_to_be_transferred, loss=True)
            user.coins = get_coins(tenantuser)
            user.save()
            PoolHistory._default_manager.create(
                tenant=to_tuser, coins=coins_to_be_transferred, profit=True)
            message = "You have received %s tokens from %s" % (coins_to_be_transferred, tenantuser.name)
            notification = Notifications(user=to_user, message=message)
            notification.save()
            return Response({"detail": "Tokens have been transferred successfully.", "coins": user.coins}, status=200)
        else:
            return Response({"detail": "Your account has insufficient tokens to complete the transfer."}, status=400)
    else:
        if not coins_to_be_transferred >= 0:
            return Response({"detail": "Tokens can't be transferred."}, status=400)
        if not to_user.kyc_done:
            return Response({"detail": "User with email isn't verified."}, status=400)
        else:
            return Response({"detail": "email doesn't exist."}, status=400)

【问题讨论】:

  • 请尝试详细说明您要达到的目标。
  • Queryset.get() 行为已记录在案 - 它应该返回一条记录,因此如果查找返回多条记录,它确实会引发(这显然是明智的做法 - ORM 将如何猜测您想要哪些记录?)。 IOW,仅将Queryset.get() 用于保证最多返回一条记录的查找。另外,FWIW,如果没有找到匹配的记录,它会引发Model.DoesNotExist,所以你也必须处理这种情况。

标签: python django django-rest-framework


【解决方案1】:

由于您有多个用户拥有相同的电子邮件,因此您不能为此使用get()

解决方法:

  1. 更改您的模型并为unique=True 字段添加unique=True。首先删除重复的电子邮件。

  1. 将此行 to_user = User.objects.get(email=email) 更改为 to_user = User.objects.filter(email=email).first()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 2022-06-21
    • 2022-08-24
    相关资源
    最近更新 更多