【问题标题】:How do I solve ValueError: too many values to unpack (expected 2) in Django如何解决 ValueError:在 Django 中解包的值太多(预期为 2)
【发布时间】:2020-08-30 15:59:04
【问题描述】:

我一直在 Django 应用程序中工作。基本上,该应用程序的功能是使用表单将输入作为用户的主题名称,获取该特定用户的该主题的进度活动的详细信息,并将每个详细信息保存在单个变量中。它涉及3个模型,即。 User Model(Django默认)Subject Model和Detail Model,最后会使用那些分配了details的变量,使用fuzz_algo()计算性能,然后以Messages的形式将结果返回给Template。

一切似乎都很好,但是当我单击模板users/performance_calculator.html 中的计算按钮时,它在views.py 中的此语句skype = Detail.objects.filter(subject__subject=sub, user__username=User.username).get('skype_session_attendance') 中给出此错误ValueError: too many values to unpack (expected 2)

我的意见.py:

from django.shortcuts import render, redirect
from django.contrib import messages
from .forms import PerformanceCalculatorForm
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from .models import Subject, Detail
from .fuzzy_logic_algo import fuzz_algo

def performanceCalculator(request):
    skype = 0
    internal_course = 0
    prg_lab = 0
    mid_marks = 0
    final_marks = 0
    sub = 0
    if request.method == 'POST':
        performance_form = PerformanceCalculatorForm(request.POST)

        if performance_form.is_valid():
            performance_form.save()

            sub = performance_form.cleaned_data.get('subject')
            skype = Detail.objects.filter(subject__subject=sub, user__username=User.username).get('skype_session_attendance')
            internal_course = Detail.objects.filter(subject__subject=sub, user__username=User.username).get('internal_course_marks')
            prg_lab = Detail.objects.filter(subject__subject=sub, user__username=User.username).get('programming_lab_activity')
            mid_marks = Detail.objects.filter(subject__subject=sub, user__username=User.username).get('mid_term_marks')
            final_marks = Detail.objects.filter(subject__subject=sub, user__username=User.username).get('final_term_marks')

            result = fuzz_algo(skype, internal_course, prg_lab, mid_marks, final_marks)

            messages.success(request, result)

            return redirect('performance_calculator')
    else:
        performance_form = PerformanceCalculatorForm()

    context = {
        'performance_form': performance_form
    }

    return render(request, 'users/performance_calculator.html', context)

我的models.py:

from django.db import models
from django.contrib.auth.models import User

class Subject(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    subject = models.CharField(max_length=100)

    def __str__(self):
        return '{} ({})'.format(self.subject, self.user.username)


class Detail(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    subject = models.OneToOneField(Subject, on_delete=models.CASCADE)
    skype_session_attendance = models.FloatField()
    internal_course_marks = models.FloatField()
    programming_lab_activity = models.FloatField()
    mid_term_marks = models.FloatField()
    final_term_marks = models.FloatField()

    def __str__(self):
        return f'{self.subject, (self.user.username)} Details'

class Sub(models.Model):
    s = models.CharField(max_length=100)

我的forms.py:

from django import forms
from .models import Profile, Sub

class PerformanceCalculatorForm(forms.ModelForm):
    subject = forms.CharField(max_length=100)

    class Meta:
        model = Sub
        fields = ['subject']

我的performance_calculator.html(模板):

{% load static %}
{% load crispy_forms_tags %}
<!DOCTYPE html>
<html>
    <head>
        <!-- Required meta tags -->
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

        <!-- Bootstrap CSS -->
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
        <link rel="stylesheet" type="text/css" href="{% static 'esacp/main.css' %}">

        <title>Expert System for Assessing Programming Course Performance</title>
    </head>

    <body>        
        <main role="main" class="container">
            <div class="row">
                <div class="col-md-8">
                    {% if messages %}
                        {% for message in messages %}
                            <div class="alert alert-{{ message.tags }}">
                                {{ message }}
                            </div>
                        {% endfor %}
                    {% endif %}

                    {% if not request.user.is_superuser and not request.useris_staff %}
                        <div class="account-heading">
                            <h2>
                                Performance Calculator
                            </h2>
                        </div>

                        <div class="content-section">
                            <form method="POST">
                                {% csrf_token %}
                                <fieldset class="form-group">
                                    <legend class="border-bottom mb-4"></legend>
                                    {{ performance_form|crispy }}
                                </fieldset>
                                <div class="from-group">
                                    <button class="btn btn-outline-info" type="submit">Calculate</button>
                                </div>
                            </form>
                        </div>
                    {% endif %}
                </div>                
            </div>
        </main>

        <!-- Optional JavaScript -->
        <!-- jQuery first, then Popper.js, then Bootstrap JS -->
        <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
    </body>
</html>

我在声明 skype = Detail.objects.filter(subject__subject=sub, user__username=User.username).get('skype_session_attendance') 中得到的完整错误是:

ValueError at /esacp/performance-calculator/
too many values to unpack (expected 2)
Request Method: POST
Request URL:    http://localhost:8000/esacp/performance-calculator/
Django Version: 3.0.3
Exception Type: ValueError
Exception Value:    
too many values to unpack (expected 2)
Exception Location: C:\environments\bsse_fyp\lib\site-packages\django\db\models\sql\query.py in build_filter, line 1247
Python Executable:  C:\environments\bsse_fyp\Scripts\python.exe
Python Version: 3.8.1
Python Path:    
['C:\\Users\\khubi\\OneDrive\\Desktop\\FYP\\test_phase',
 'C:\\Users\\khubi\\AppData\\Local\\Programs\\Python\\Python38-32\\python38.zip',
 'C:\\Users\\khubi\\AppData\\Local\\Programs\\Python\\Python38-32\\DLLs',
 'C:\\Users\\khubi\\AppData\\Local\\Programs\\Python\\Python38-32\\lib',
 'C:\\Users\\khubi\\AppData\\Local\\Programs\\Python\\Python38-32',
 'C:\\environments\\bsse_fyp',
 'C:\\environments\\bsse_fyp\\lib\\site-packages']
Server time:    Thu, 14 May 2020 07:12:19 +0000

我不知道出了什么问题以及为什么会显示此错误。我在这里阅读了与相同问题相关的其他线程,但他们的问题是他们使用的是 2D 元组而不是 1D 元组,或者有时是字典或列表问题,但我没有这些。

我花了几个小时寻找问题,但找不到问题。非常感谢您的帮助。

【问题讨论】:

  • 参数user__username=User.username应该做什么?
  • 应该是获取当前用户(基本上是学生)使用系统的用户名。
  • 但是要做的是检查usernameuser 是否等于User 类的字段 username(字段,而不是它的值),这是没有意义的。
  • 实际上它被用作过滤器,所以是的,它会检查以过滤掉可能包括其他用户主题的主题。目的是根据他/她在如此胖的主题中的进展(详细模型包含进度)来计算当前用户的一个主题(我们从用户那里获取其名称作为输入)的表现。
  • 我明白了,那么,有没有更好或更正确的方法来使用当前用户的用户名来过滤主题列表?

标签: python django valueerror


【解决方案1】:
detail = Detail.objects.filter(...).first()
if detail:
    skype = detail.skype_session_attendance

您正在调用QuerySet 实例的get 方法。这需要 kwargs 并返回一个实例,如果结果为 None 或有多个实例则抛出错误。 要获取 Skype 值,您必须先获取实例。

【讨论】:

  • 我如何获得第一个实例?
  • 我在 skype 语句中添加了.values().first(),但现在在同一语句中'NoneType' object has no attribute 'get' 给了我这个错误。
猜你喜欢
  • 1970-01-01
  • 2018-05-22
  • 2017-08-29
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 2014-07-31
  • 2017-12-14
  • 2017-07-15
相关资源
最近更新 更多