' Объект QuerySet не имеет атрибута 'enter_the_destination_account_number'

Может ли кто-нибудь сказать мне, что не так с моим кодом? Я пытаюсь использовать фильтр, но он показывает, что объект ''QuerySet'' не имеет атрибута 'enter_the_destination_account_number'. Я пробовал get(), но он показывает,

get() returned more than one MoneyTransfer -- it returned 14!.

вот несколько фрагментов кода. Заранее спасибо

models.py

    class Status (models.Model):
    user_name = models.CharField(max_length=150, default=None)
    account_number = models.IntegerField()
    balance = models.IntegerField()
    phone_number= models.CharField(max_length=20, default=0)

    class MoneyTransfer(models.Model):
    enter_your_user_name = models.CharField(max_length = 150, default = None)
    enter_the_destination_account_number = models.IntegerField()
    enter_the_destination_phone_number=models.CharField(max_length=20, default=None)
    enter_the_amount_to_be_transferred_in_INR = models.IntegerField()

views.py


    def TransferMoney(request):
    if request.method == "POST":
        form = forms.MoneyTransferForm(request.POST)
        if form.is_valid():
            form.save()

            curr_user = models.MoneyTransfer.objects.filter(enter_your_user_name=request.user)
            dest_user_acc_num = curr_user.enter_the_destination_account_number  #dest_phone number add korte hobe
            dest_phone_num= curr_user.enter_the_destination_phone_number

            temp = curr_user  # NOTE: Delete this instance once money transfer is done

            dest_user = models.Status.objects.get(account_number=dest_user_acc_num)  # FIELD 1
            dest_phn= models.Status.objects.get(phone_number= dest_phone_num)
            transfer_amount = curr_user.enter_the_amount_to_be_transferred_in_INR  # FIELD 2
            curr_user = models.Status.objects.get(user_name=request.user)  # FIELD 3

            # Now transfer the money!
            curr_user.balance = curr_user.balance - transfer_amount
            #dest_phn.balance = dest_phn.balance + transfer_amount
            dest_user.balance = dest_user.balance + transfer_amount

            # Save the changes before redirecting
            curr_user.save()
            dest_user.save()

            temp.delete()  # NOTE: Now deleting the instance for future money transactions

        return redirect(index)
    else:
        form = forms.MoneyTransferForm()
    return render(request, "epayapp/Transfer_money.html", {"form": form})

Проблема в том, что filter возвращает queryset, а не объект. Поэтому вы не можете получить доступ к полям непосредственно из набора queryset, что вы можете сделать, так это взять первый элемент из набора queryset и выполнить нужные вам операции. Например: curr_user = models.MoneyTransfer.objects.filter(enter_your_user_name=request.user).first() Таким образом, это будет выглядеть следующим образом:

def TransferMoney(request):
    if request.method == "POST":
        form = forms.MoneyTransferForm(request.POST)
        if form.is_valid():
            form.save()
            # Grab the first object from the queryset
            curr_user = models.MoneyTransfer.objects.filter(enter_your_user_name=request.user).first()
       
            dest_user_acc_num = curr_user.enter_the_destination_account_number  #dest_phone number add korte hobe
            dest_phone_num= curr_user.enter_the_destination_phone_number

            temp = curr_user  # NOTE: Delete this instance once money transfer is done

            dest_user = models.Status.objects.get(account_number=dest_user_acc_num)  # FIELD 1
            dest_phn= models.Status.objects.get(phone_number= dest_phone_num)
            transfer_amount = curr_user.enter_the_amount_to_be_transferred_in_INR  # FIELD 2
            curr_user = models.Status.objects.get(user_name=request.user)  # FIELD 3

            # Now transfer the money!
            curr_user.balance = curr_user.balance - transfer_amount
            #dest_phn.balance = dest_phn.balance + transfer_amount
            dest_user.balance = dest_user.balance + transfer_amount

            # Save the changes before redirecting
            curr_user.save()
            dest_user.save()

            temp.delete()  # NOTE: Now deleting the instance for future money transactions

        return redirect(index)
    else:
        form = forms.MoneyTransferForm()
    return render(request, "epayapp/Transfer_money.html", {"form": form})

метод фильтрации объектов не возвращает объект, как вы думаете. он возвращает объект Queryset

Вы должны зациклиться на результатах фильтра или взять элемент с помощью функции first(), например

def TransferMoney(request):
    if request.method == "POST":
        form = forms.MoneyTransferForm(request.POST)
        if form.is_valid():
            form.save()

            queryset = models.MoneyTransfer.objects.filter(enter_your_user_name=request.user)
            curr_user = queryset.first()

            dest_user_acc_num = curr_user.enter_the_destination_account_number  #dest_phone number add korte hobe
            dest_phone_num= curr_user.enter_the_destination_phone_number

            temp = curr_user  # NOTE: Delete this instance once money transfer is done

            dest_user = models.Status.objects.get(account_number=dest_user_acc_num)  # FIELD 1
            dest_phn= models.Status.objects.get(phone_number= dest_phone_num)
            transfer_amount = curr_user.enter_the_amount_to_be_transferred_in_INR  # FIELD 2
            curr_user = models.Status.objects.get(user_name=request.user)  # FIELD 3

            # Now transfer the money!
            curr_user.balance = curr_user.balance - transfer_amount
            #dest_phn.balance = dest_phn.balance + transfer_amount
            dest_user.balance = dest_user.balance + transfer_amount

            # Save the changes before redirecting
            curr_user.save()
            dest_user.save()

            temp.delete()  # NOTE: Now deleting the instance for future money transactions

        return redirect(index)
    else:
        form = forms.MoneyTransferForm()
    return render(request, "epayapp/Transfer_money.html", {"form": form})

функцияget должна возвращать только один элемент, иначе возникнет исключение... Возможно, в определении полей для предотвращения таких случаев нужно установить уникальность полей account_number и user_name

Вернуться на верх