Поле ‘id’ ожидало число, но получило ‘abdullah123’

#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. Спасибо за ваше время… Я решил свою проблему. я пометил свой вопрос как решенный