#python #django #django-models #django-views #django-templates
#python #django #django-модели #django-просмотры #django-шаблоны
Вопрос:
Я пытаюсь получить баланс из фильтра таблицы 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 и модели.py-код. Я попытался использовать фильтр с именем пользователя, и он выдает ошибку, и я также попытался использовать метод get … но снова получаю ту же ошибку. Также, пожалуйста, объясните мне, как работает get и filter
Комментарии:
1. Покажите нам свою модель баланса пользователей, я подозреваю, что имя пользователя — это внешний ключ, верно?
Ответ №1:
Когда вы используете:
username=models.ForeignKey(User, on_delete=models.CASCADE)
username
на самом деле это не имя пользователя; Это User
. Итак, вам нужно запросить для пользователя заданное user
, например:
user_balance=UserBalance.objects.filter(username=user)
(Конечно, вам следует изменить 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)
Комментарии:
1. Спасибо за ваше время. Моя проблема была решена… я пометил этот вопрос как решенный
Ответ №2:
username
Полем UserBalance
модели является ForeignKey
to User
. Поэтому, когда вы делаете filter
или get
в этом поле, вы не можете сделать это, используя строковое имя пользователя. Вам нужно либо передать весь User
экземпляр, либо (целочисленный) идентификатор такого экземпляра.
Поэтому, чтобы получить UserBalance
имена пользователей с определенным именем пользователя, вам нужно сначала найти все User
экземпляры с этим именем пользователя, затем найти все UserBalance
имена с username
полем, которое соответствует одному из них. И вы могли бы сделать это с помощью двух отдельных запросов — но, очевидно, эффективнее сделать это одним запросом, что позволяет Django с его интуитивно понятным API запросов: user_balance=UserBalance.objects.filter(username__username=username)
И если это выглядит сбивающим с толку (что так и есть!), это потому, что ваше ForeignKey
поле неправильно названо как username
, когда оно должно быть просто чем-то вроде user
.
Комментарии:
1. спасибо за ваш ответ… я получаю значение следующим образом … <Набор запросов [<Баланс пользователей: объект баланса пользователей (1)>]>
2. я попробовал это —> user_balance = UserBalance.objects.filter(имя пользователя__username=username).values_list(‘balance’, flat = True) …. но я получаю это как результат, ваш общий баланс равен <Набор запросов [1000]>
3. я получил output…by выполняем UserBalance.objects.filter(имя пользователя__username=username).values_list(‘balance’, flat= True)[0]
4. Спасибо за ваше время… Я решил свою проблему. я пометил свой вопрос как решенный