Django error: too many values to unpack (expected 2) after adding model record

Viewed 64

The idea

To make the code a bit more understandable, I will first explain what my code (from which the problem probably comes) is supposed to do in the first place: I save reports in my model. I give these reports their own ID or numbering, because this is absolutely necessary.This ID shall be structured as follows:

<year><ascending number with leading zeros>

Example: 2021001, 2021002, ..., 2022001

The code

I have developed the following code for this purpose. Since the value is to be calculated automatically, I use the @property decorator. To be able to use the ID later more easily as a field and simply for my REST Api, I use the computed_property package.

Extract from models.py:

einsatznummer = ComputedTextField(blank=True, compute_from="einsatznummer_calc")

@property
    def einsatznummer_calc(self):
        year_einsatz = self.einsatz_start.strftime('%Y')
        last_number = EinsatzPublic.objects.filter(einsatznummer__isnull=False, einsatz_start__year=year_einsatz).values_list('einsatznummer', flat=True)
        
        if EinsatzPublic.objects.filter('einsatznummer').count() >= 1:
            # if last_number == None :
            #     last_number = 0
            if  last_number[:-1] != year_einsatz:
                last_number = 0
                einsatznummer_gen = year_einsatz + (last_number + 1)
                return einsatznummer_gen
        else:
            einsatznummer_gen = (year_einsatz + 1)
            return einsatznummer_gen

When I tried to add a record to the model (DeploymentPublic) I got the following error which I can't solve.

Internal Server Error: /super/einsatzverwaltung/einsatzpublic/add/
Traceback (most recent call last):
(...)
ValueError: too many values to unpack (expected 2)

Then I tried to see if it was the ComputedTextField and temporarily removed it. As a result, I got the following error when creating a new record:

 Internal Server Error: /super/einsatzverwaltung/einsatzpublic/add/  
 File
 (...)
 "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\db\models\base.py",
 line 828, in _save_table
     raise ValueError("Cannot force an update in save() 
with no primary key.") ValueError: Cannot force an update in save() with no primary key.

Maybe someone here can help me because I'm really at a loss and can't find the issue.

Error Code after fixing Error 1

Commented ComputedTextField out:

Internal Server Error: /super/einsatzverwaltung/einsatzpublic/add/
Traceback (most recent call last):
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\contrib\admin\options.py", line 616, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\utils\decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\views\decorators\cache.py", line 44, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\contrib\admin\sites.py", line 232, in inner
    return view(request, *args, **kwargs)
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\contrib\admin\options.py", line 1657, in add_view
    return self.changeform_view(request, None, form_url, extra_context)    
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\utils\decorators.py", line 43, in _wrapper
    return bound_method(*args, **kwargs)
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\utils\decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\contrib\admin\options.py", line 1540, in changeform_view
    return self._changeform_view(request, object_id, form_url, extra_context)
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\contrib\admin\options.py", line 1586, in _changeform_view
    self.save_model(request, new_object, form, not add)
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\contrib\admin\options.py", line 1099, in save_model
    obj.save()
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\db\models\base.py", line 726, in save
    self.save_base(using=using, force_insert=force_insert,
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\db\models\base.py", line 763, in save_base
    updated = self._save_table(
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\db\models\base.py", line 828, in _save_table
    raise ValueError("Cannot force an update in save() with no primary key.")
ValueError: Cannot force an update in save() with no primary key.
[09/Jun/2021 18:35:45] "POST /super/einsatzverwaltung/einsatzpublic/add/ HTTP/1.1" 500 133976

With the ComputedText Field

Traceback (most recent call last):
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\contrib\admin\options.py", line 616, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\utils\decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\views\decorators\cache.py", line 44, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\contrib\admin\sites.py", line 232, in inner
    return view(request, *args, **kwargs)
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\contrib\admin\options.py", line 1657, in add_view
    return self.changeform_view(request, None, form_url, extra_context)    
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\utils\decorators.py", line 43, in _wrapper
    return bound_method(*args, **kwargs)
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\utils\decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\contrib\admin\options.py", line 1540, in changeform_view
    return self._changeform_view(request, object_id, form_url, extra_context)
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\contrib\admin\options.py", line 1586, in _changeform_view
    self.save_model(request, new_object, form, not add)
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\contrib\admin\options.py", line 1099, in save_model
    obj.save()
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\db\models\base.py", line 726, in save
    self.save_base(using=using, force_insert=force_insert,
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\db\models\base.py", line 750, in save_base
    pre_save.send(
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\dispatch\dispatcher.py", line 180, in send
    return [
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\django\dispatch\dispatcher.py", line 181, in <listcomp>
    (receiver, receiver(signal=self, sender=sender, **named))
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\computed_property\fields.py", line 61, in resolve_computed_field
    setattr(instance, self.get_attname(), self.calculate_value(instance))  
  File "C:\Users\marce\.virtualenvs\backend-ZTyOc35O\lib\site-packages\computed_property\fields.py", line 73, in calculate_value
    instance_compute_object = getattr(instance, self.compute_from)
  File "D:\04-Dev\Projekt\feuerwehr-ensdorf-webapp-cms\backend\einsatzverwaltung\models.py", line 141, in einsatznummer_calc
    if last_number >= 1:
TypeError: '>=' not supported between instances of 'QuerySet' and 'int'    
[09/Jun/2021 18:44:05] "POST /super/einsatzverwaltung/einsatzpublic/add/ HTTP/1.1" 500 150838
1 Answers

EinsatzPublic.objects.filter('einsatznummer').count() >= 1 makes no sense, since you can not filter with a string.

You should work with a (or multiple) Q objects, and/or parameters like you did when filtering the line above. If it is the same as last_number, you can reuse this queryset:

@property
def einsatznummer_calc(self):
    year_einsatz = self.einsatz_start.strftime('%Y')
    last_number = EinsatzPublic.objects.filter(einsatznummer__isnull=False, einsatz_start__year=year_einsatz).values_list('einsatznummer', flat=True)
    
    if last_number:
        # if last_number == None :
        #     last_number = 0
        if  last_number[:-1] != year_einsatz:
            last_number = 0
            einsatznummer_gen = year_einsatz + (last_number + 1)
            return einsatznummer_gen
    else:
        einsatznummer_gen = (year_einsatz + 1)
        return einsatznummer_gen
Related