繁体   English   中英

Django ValueError:要解压的值太多(预期为 2)

[英]Django ValueError: too many values to unpack (expected 2)

我是 Django 的初学者,我需要有关 django 2.2 应用程序的帮助。

我有一个多对多关系的虚拟机和计划。 我正在尝试创建一个新的时间表,但出现错误。 基本上,在我的日程表创建表单中,我会在列中显示 VM 列表。 因此,我们可以选择要分配时间表的机器。 但是我想要在另一列中显示我使用原始查询尝试的现有时间表,它显示良好,但是当我尝试发送表单时出现错误:

我的错误:

Exception Type: ValueError at /appli/vm/schedule/create
Exception Value: too many values to unpack (expected 2)
# MY MODELS

 class VirtualMachine(models.Model):
    name = models.CharField(max_length=200)
    vm = models.CharField(max_length=32)
    cpu_count = models.IntegerField(default=0)
    power_state = models.CharField(max_length=16, default='POWERED_OFF')
    memory_size_MiB = models.IntegerField(default=0)
    vmware = models.ForeignKey(Vmware, on_delete=models.CASCADE)
    lock = models.BooleanField(default=False)
    criticity = models.CharField(max_length=10, default='medium')
    existing = models.BooleanField(default=False)
​
class VmSchedule(models.Model):
    schedule = models.CharField(max_length=32, blank=False)
    action = models.CharField(max_length=14, blank=False, default="POWERED_ON")
    dow = models.CharField(max_length=1, blank=False)
    dom = models.CharField(max_length=2, blank=False)
    mon = models.CharField(max_length=2, blank=False)
    h = models.CharField(max_length=2, blank=False)
    m = models.CharField(max_length=2, blank=False)
    pause = models.BooleanField(default=False)
    vms = models.ManyToManyField(VirtualMachine, blank=True)


# MY TEMPLATE
{% for i in form.vms.field.choices %}
    <tr class="clickable_vm">
        <td>
            <label for="{{ i.0 }}">
                <input type="checkbox" name="vms" value="{{ i.0 }}" class="displaynone" id="{{ i.0 }}">{{ i.1 }}
            </label>
        </td>
        <td class="schedule-name">{% for j in i.2 %}{{ j }}<br/>{% endfor %}</td>
    </tr>
{% endfor %}


# MY RAW QUERY
cursor = connection.cursor()
cursor.execute(
    ' SELECT vmware_virtualmachine.id,'
    ' vmware_virtualmachine.name,'
    ' group_concat( appli_vmschedule.schedule) as "schedule"'
    ' FROM vmware_virtualmachine'
    ' LEFT OUTER JOIN appli_vmschedule_vms'
    ' ON (vmware_virtualmachine.id = appli_vmschedule_vms.virtualmachine_id)'
    ' LEFT OUTER JOIN appli_vmschedule'
    ' ON (appli_vmschedule_vms.vmschedule_id = appli_vmschedule.id)'
    ' group by vmware_virtualmachine.name')
vm_sche_list = cursor.fetchall()
vm_sche_list = [list(ele) for ele in vm_sche_list]
for i in vm_sche_list:
    if i[2] is None:
        i[2] = ''
    else:
        i[2] = list(i[2].split(','))


# MY CLASS form
    vms = MultipleChoiceField(required=True,
                              widget=forms.SelectMultiple(attrs={
                                'class': 'form-control form-form shadow-none '
                                'td-margin-bottom-5 textarea_custom',
                                'placeholder': 'Name'}),
                              choices=vm_sche_list,
                              )

有没有另一种方法可以用查询集做我想做的事? 或者我的实际代码的解决方案?

追溯

    Environment:
​
​
Request Method: POST
Request URL: http://127.0.0.1:8000/appli/vm/schedule/create
​
Django Version: 2.2.14
Python Version: 3.8.10
Installed Applications:
['celery_progress',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admindocs',
 'accounts.apps.AccountsConfig',
 'arista.apps.AristaConfig',
 'appli.apps.AppliConfig',
 'fortigate.apps.FortigateConfig',
 'objects.apps.ObjectsConfig',
 'partials.apps.PartialsConfig',
 'phpipam.apps.PhpipamConfig',
 'vmware.apps.VmwareConfig',
 'forticonnect.apps.ForticonnectConfig']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']
​
​
​
Traceback:
​
File "C:\Users\ibouzidi\PycharmProjects\api\venv\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)
​
File "C:\Users\ibouzidi\PycharmProjects\api\venv\lib\site-packages\django\core\handlers\base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)
​
File "C:\Users\ibouzidi\PycharmProjects\api\venv\lib\site-packages\django\core\handlers\base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)
​
File "C:\Users\ibouzidi\PycharmProjects\api\venv\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view
  21.                 return view_func(request, *args, **kwargs)
​
File "C:\Users\ibouzidi\PycharmProjects\api\appli\views\vm.py" in vm_schedule_create
  465.         if form.is_valid():
​
File "C:\Users\ibouzidi\PycharmProjects\api\venv\lib\site-packages\django\forms\forms.py" in is_valid
  185.         return self.is_bound and not self.errors
​
File "C:\Users\ibouzidi\PycharmProjects\api\venv\lib\site-packages\django\forms\forms.py" in errors
  180.             self.full_clean()
​
File "C:\Users\ibouzidi\PycharmProjects\api\venv\lib\site-packages\django\forms\forms.py" in full_clean
  381.         self._clean_fields()
​
File "C:\Users\ibouzidi\PycharmProjects\api\venv\lib\site-packages\django\forms\forms.py" in _clean_fields
  399.                     value = field.clean(value)
​
File "C:\Users\ibouzidi\PycharmProjects\api\venv\lib\site-packages\django\forms\fields.py" in clean
  149.         self.validate(value)
​
File "C:\Users\ibouzidi\PycharmProjects\api\venv\lib\site-packages\django\forms\fields.py" in validate
  869.             if not self.valid_value(val):
​
File "C:\Users\ibouzidi\PycharmProjects\api\venv\lib\site-packages\django\forms\fields.py" in valid_value
  809.         for k, v in self.choices:
​
Exception Type: ValueError at /appli/vm/schedule/create
Exception Value: too many values to unpack (expected 2)

我找到了一个解决方案,我将 SQL 查询放在我的视图 vm.py 中。 然后我将查询的结果转换成一个字典,并在其中进行迭代。

像这样 :

mydict = dict()
for ele in vm_sche_list:
  mydict[ele[0]] = [ele[1], ele[2]]
for i, j in mydict.items():
 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM