How to solve Django ValueError: Field 'id' expected a number

Question:

I am making filters in Django to select data from a database. Now it looks like:

view.py:

def get_current_user(request):
    current_user = request.user
    return current_user


def is_valid_query_param(param):
    return param != '' and param is not None


def bootstrapFilterView(request):
    user = get_current_user(request)
    qs = CompletedWork.objects.filter(checked_by_head=True)
    struct_divisions = StructuralDivisions.objects.filter(
        Q(head=user) |
        Q(management_unit__head=user) |
        Q(curator=user) |
        Q(management_unit__curator=user)
    )
    workers = CustomUser.objects.filter(
        Q(struct_division__head=user) |
        Q(struct_division__management_unit__head=user) |
        Q(struct_division__curator=user) |
        Q(struct_division__management_unit__curator=user)
    )
    workstype = WorksType.objects.filter(
        Q(available_to__head=user) |
        Q(available_to__curator=user)
    ).distinct()

    work_notes_contains_query = request.GET.get('work_notes_contains')
    work_scope_min = request.GET.get('work_scope_min')
    work_scope_max = request.GET.get('work_scope_max')
    period_min = request.GET.get('period_min')
    period_max = request.GET.get('period_max')
    struct_division = request.GET.get('struct_division')
    worker = request.GET.get('worker')
    work_done = request.GET.get('work_done')

    if is_valid_query_param(work_notes_contains_query):
        qs = qs.filter(work_notes__icontains=work_notes_contains_query)

    if is_valid_query_param(work_scope_min):
        qs = qs.filter(work_scope__gte=work_scope_min)

    if is_valid_query_param(work_scope_max):
        qs = qs.filter(work_scope__lte=work_scope_max)

    if is_valid_query_param(period_min):
        qs = qs.filter(period__date__gte=period_min)

    if is_valid_query_param(period_max):
        qs = qs.filter(period__date__lte=period_max)

    if is_valid_query_param(struct_division) and struct_division != 'Choose...':
        qs = qs.filter(worker__struct_division__name=struct_division)

    if is_valid_query_param(worker) and worker != 'Choose...':
        qs = qs.filter(worker=worker)

    if is_valid_query_param(work_done) and work_done != 'Choose...':
        qs = qs.filter(work_done__name=work_done)

    context = {
        'queryset': qs,
        'struct_divisions': struct_divisions,
        'workers': workers,
        'workstype': workstype,
    }
    return render(request, 'bootstrap_form.html', context)

All works well, except:

if is_valid_query_param(worker) and worker != 'Choose...':
            qs = qs.filter(worker=worker)

It’s return ValueError at /boot/
Field ‘id’ expected a number but got ‘Chambers Jessica ‘.
I tried different syntax, but nothing helped
How can I pick up id or pk from worker? Or is there another way?

models.py:



class CompletedWork(models.Model):
    period = models.ForeignKey(directory.Period,
                               on_delete=models.SET('deleted date'),
                               )
    worker = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET('deleted worker'),
        related_name='worker_do', default=settings.AUTH_USER_MODEL
    )
    work_done = models.ForeignKey(directory.WorksType, on_delete=models.SET('deleted works type'))
    work_scope = models.FloatField(blank=True, null=True)
    work_notes = models.CharField(_("Comments"), max_length=70, blank=True, null=True, )
    record_author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET('deleted user'),
        related_name='record_author', auto_created=True,
    )
    record_date = models.DateTimeField(auto_now=True)
    checked_by_head = models.BooleanField(default=False)


    def __repr__(self):
        return f'{self.period}, {self.worker}, {self.work_done}'

    def __str__(self):
        return self.__repr__()

Traceback (most recent call last):
  File "C:UsersalexaPycharmProjectsdjangoReportingToolvenvlibsite-packagesdjangodbmodelsfields__init__.py", line 2018, in get_prep_value
    return int(value)
ValueError: invalid literal for int() with base 10: 'Acosta Regina '

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:UsersalexaPycharmProjectsdjangoReportingToolvenvlibsite-packagesdjangocorehandlersexception.py", line 55, in inner
    response = get_response(request)
  File "C:UsersalexaPycharmProjectsdjangoReportingToolvenvlibsite-packagesdjangocorehandlersbase.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:UsersalexaPycharmProjectsdjangoReportingToolReportingToolviews.py", line 190, in bootstrapFilterView
    qs = qs.filter(worker=worker)
  File "C:UsersalexaPycharmProjectsdjangoReportingToolvenvlibsite-packagesdjangodbmodelsquery.py", line 1420, in filter
    return self._filter_or_exclude(False, args, kwargs)
  File "C:UsersalexaPycharmProjectsdjangoReportingToolvenvlibsite-packagesdjangodbmodelsquery.py", line 1438, in _filter_or_exclude
    clone._filter_or_exclude_inplace(negate, args, kwargs)
  File "C:UsersalexaPycharmProjectsdjangoReportingToolvenvlibsite-packagesdjangodbmodelsquery.py", line 1445, in _filter_or_exclude_inplace
    self._query.add_q(Q(*args, **kwargs))
  File "C:UsersalexaPycharmProjectsdjangoReportingToolvenvlibsite-packagesdjangodbmodelssqlquery.py", line 1532, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "C:UsersalexaPycharmProjectsdjangoReportingToolvenvlibsite-packagesdjangodbmodelssqlquery.py", line 1562, in _add_q
    child_clause, needed_inner = self.build_filter(
  File "C:UsersalexaPycharmProjectsdjangoReportingToolvenvlibsite-packagesdjangodbmodelssqlquery.py", line 1478, in build_filter
    condition = self.build_lookup(lookups, col, value)
  File "C:

UsersalexaPycharmProjectsdjangoReportingToolvenvlibsite-packagesdjangodbmodelssqlquery.py", line 1303, in build_lookup
    lookup = lookup_class(lhs, rhs)
  File "C:UsersalexaPycharmProjectsdjangoReportingToolvenvlibsite-packagesdjangodbmodelslookups.py", line 27, in __init__
    self.rhs = self.get_prep_lookup()
  File "C:UsersalexaPycharmProjectsdjangoReportingToolvenvlibsite-packagesdjangodbmodelsfieldsrelated_lookups.py", line 166, in get_prep_lookup
    self.rhs = target_field.get_prep_value(self.rhs)
  File "C:UsersalexaPycharmProjectsdjangoReportingToolvenvlibsite-packagesdjangodbmodelsfields__init__.py", line 2020, in get_prep_value
    raise e.__class__(
ValueError: Field 'id' expected a number but got 'Acosta Regina '.
[03/Oct/2022 19:48:36] "GET /boot/?period_min=&period_max=&struct_division=Choose...&worker=Acosta+Regina+&work_notes_contains=&work_done=Choose...&work_scope_min=&work_scope_max= HTTP/1.1" 500 132448
Asked By: Alex

||

Answers:

My guess is your worker = request.GET.get('worker') line yields a string and worker field is a ForeignKey. request.GET.get('worker') should either be an int of worker primary key or do a query before the problematic line to find the instance: worker = Worker.objects.get(param=request.GET.get('worker'))

Answered By: Alek Yo

I expanded and wrote a separate logic for "worker" like this:

worker = request.GET.get('worker')

if worker and worker != 'Choose...':
    middle_name = None

    try:
        last_name, first_name, middle_name = worker.split()
        try:
            worker_get_id = CustomUser.objects.get(last_name=last_name,
                                                   first_name=first_name,
                                                   middle_name=middle_name)
        except  ValueError:
            worker_get_id = None

    except ValueError:
        last_name, first_name = worker.split()
        worker_get_id = CustomUser.objects.get(last_name=last_name,
                                               first_name=first_name)
Answered By: Alex
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.