Python 字段';id';应为一个数字,但得到';阿卜杜拉123';

Python 字段';id';应为一个数字,但得到';阿卜杜拉123';,python,django,django-models,django-views,django-templates,Python,Django,Django Models,Django Views,Django Templates,我试图通过用户名从UserBalance表过滤器中获取余额 我尝试过使用UserBalance.objects.filter(username=username)但实际遇到错误 #views.py def login_validation(request): if request.method=='POST': username=request.POST.get("username")

我试图通过用户名从UserBalance表过滤器中获取余额

我尝试过使用
UserBalance.objects.filter(username=username)
但实际遇到错误

    #views.py
    
        def login_validation(request):
            if request.method=='POST':
                username=request.POST.get("username")
                password=request.POST.get("password")
                user=auth.authenticate(username=username, password=password)
        
        
                if user is not None:
                    auth.login(request, user)
                    user_balance=UserBalance.objects.filter(username=username) #error_i_am_getting_here
                    return render(request, "homepage.html", {'name':username, 'balance':user_balance})
                else:
                    return redirect("http://google.com/")
        
            else:
                return redirect("http://yahoo.com/")
    
    
    #models.py
    
    from django.db import models
    from django.contrib.auth.models import User
    
    class IncomeExpense(models.Model):
        entry_type=models.CharField(max_length=100)
        amount=models.IntegerField()
        details=models.TextField()
        capture_date=models.DateField()
        username=models.ForeignKey(User, on_delete=models.CASCADE)
    
    class UserBalance(models.Model):
        balance=models.IntegerField()
        username=models.ForeignKey(User, on_delete=models.CASCADE)
我已经粘贴了views.py和models.py代码。我尝试使用用户名过滤器,它给出了一个错误,我也尝试使用get方法…但再次得到相同的错误。另外,请向我解释使用以下工具时get和filter是如何工作的:

username=models.ForeignKey(User, on_delete=models.CASCADE)
用户名
不是真正的用户名;它是
用户
。因此,您必须查询给定
用户的用户,如:

user_balance=UserBalance.objects.filter(username=user)
(当然,您应该将模型中的
用户名
字段更改为
用户
,但这就回答了问题)

下面是更好的代码:

    #views.py
    
        def login_validation(request):
            if request.method=='POST':
                username=request.POST.get("username")
                password=request.POST.get("password")
                user=auth.authenticate(username=username, password=password)
        
        
                if user is not None:
                    auth.login(request, user)
                    user_balance=UserBalance.objects.filter(user=user) #error_i_am_getting_here
                    return render(request, "homepage.html", {'name':user.username, 'balance':user_balance})
                else:
                    return redirect("http://google.com/")
        
            else:
                return redirect("http://yahoo.com/")
    
    
    #models.py
    
    from django.db import models
    from django.contrib.auth.models import User
    
    class IncomeExpense(models.Model):
        entry_type=models.CharField(max_length=100)
        amount=models.IntegerField()
        details=models.TextField()
        capture_date=models.DateField()
        user=models.ForeignKey(User, on_delete=models.CASCADE)
    
    class UserBalance(models.Model):
        balance=models.IntegerField()
        user=models.ForeignKey(User, on_delete=models.CASCADE)

UserBalance
模型的
username
字段是指向
User
外键。因此,当您在此字段上执行
筛选
获取
时,您不能使用字符串用户名。您必须传递整个
用户
实例,或者传递此类实例的(整数)id

因此,要获取具有特定用户名的用户的
UserBalance
s,您需要首先查找具有该用户名的所有
User
实例,然后查找具有与其中一个匹配的
username
字段的所有
UserBalance
s。您可以通过两个单独的查询来实现这一点,但在一个查询中实现这一点显然更有效,Django通过其直观的:
user\u balance=UserBalance.objects.filter(username\u username=username)


如果这看起来令人困惑(确实如此!),这是因为您的
ForeignKey
字段被错误地命名为
username
,而它应该只是类似于
user

显示您的UserBalance模型,我怀疑username是外键,对吗?谢谢您的回答…我得到的值如下…我尝试了-->user\u balance=UserBalance.objects.filter(username\uu username=username)。值列表('balance',flat=True)…但我将此作为输出,您的总余额是我通过执行UserBalance.objects.filter(username\uu username=username)。值列表('balance',flat=True)[0]谢谢你的时间…我的问题解决了。我把我的问题标记为已解决谢谢你的时间。我的问题解决了…我把这个问题标记为已解决