簡體   English   中英

如何解決 Django ValueError: Field 'id' expected a number

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

我正在從數據庫中過濾 Django 到 select 數據。 現在它看起來像:

查看.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)

一切正常,除了:

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

它在 /boot/ Field 'id' 處返回 ValueError 期望一個數字但得到了 'Chambers Jessica '。 我嘗試了不同的語法,但沒有任何幫助如何從工作人員那里獲取 id 或 pk? 或者還有其他方法嗎?

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:\Users\alexa\PycharmProjects\djangoReportingTool\venv\lib\site-packages\django\db\models\fields\__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:\Users\alexa\PycharmProjects\djangoReportingTool\venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
    response = get_response(request)
  File "C:\Users\alexa\PycharmProjects\djangoReportingTool\venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\alexa\PycharmProjects\djangoReportingTool\ReportingTool\views.py", line 190, in bootstrapFilterView
    qs = qs.filter(worker=worker)
  File "C:\Users\alexa\PycharmProjects\djangoReportingTool\venv\lib\site-packages\django\db\models\query.py", line 1420, in filter
    return self._filter_or_exclude(False, args, kwargs)
  File "C:\Users\alexa\PycharmProjects\djangoReportingTool\venv\lib\site-packages\django\db\models\query.py", line 1438, in _filter_or_exclude
    clone._filter_or_exclude_inplace(negate, args, kwargs)
  File "C:\Users\alexa\PycharmProjects\djangoReportingTool\venv\lib\site-packages\django\db\models\query.py", line 1445, in _filter_or_exclude_inplace
    self._query.add_q(Q(*args, **kwargs))
  File "C:\Users\alexa\PycharmProjects\djangoReportingTool\venv\lib\site-packages\django\db\models\sql\query.py", line 1532, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "C:\Users\alexa\PycharmProjects\djangoReportingTool\venv\lib\site-packages\django\db\models\sql\query.py", line 1562, in _add_q
    child_clause, needed_inner = self.build_filter(
  File "C:\Users\alexa\PycharmProjects\djangoReportingTool\venv\lib\site-packages\django\db\models\sql\query.py", line 1478, in build_filter
    condition = self.build_lookup(lookups, col, value)
  File "C:

\Users\alexa\PycharmProjects\djangoReportingTool\venv\lib\site-packages\django\db\models\sql\query.py", line 1303, in build_lookup
    lookup = lookup_class(lhs, rhs)
  File "C:\Users\alexa\PycharmProjects\djangoReportingTool\venv\lib\site-packages\django\db\models\lookups.py", line 27, in __init__
    self.rhs = self.get_prep_lookup()
  File "C:\Users\alexa\PycharmProjects\djangoReportingTool\venv\lib\site-packages\django\db\models\fields\related_lookups.py", line 166, in get_prep_lookup
    self.rhs = target_field.get_prep_value(self.rhs)
  File "C:\Users\alexa\PycharmProjects\djangoReportingTool\venv\lib\site-packages\django\db\models\fields\__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

我的猜測是您的worker = request.GET.get('worker')行產生一個字符串,而worker字段是一個 ForeignKey。 request.GET.get('worker')應該是worker主鍵的 int 或在有問題的行之前進行查詢以查找實例: worker = Worker.objects.get(param=request.GET.get('worker'))

我擴展並為“工人”編寫了一個單獨的邏輯,如下所示:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM