Как решить проблему Django ValueError: В поле 'id' ожидается число
Я делаю фильтры в Django для выбора данных из базы данных. Сейчас это выглядит так:
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)
Все работает хорошо, за исключением:
if is_valid_query_param(worker) and worker != 'Choose...':
qs = qs.filter(worker=worker)
Возврат ValueError в /boot/ Поле 'id' ожидало число, но получило 'Chambers Jessica '. Я пробовал разные варианты синтаксиса, но ничего не помогло. Как я могу забрать id или pk из рабочего? Или есть другой способ?
Моя догадка в том, что ваша строка worker = request.GET.get('worker')
дает строку, а поле worker
является ForeignKey. request.GET.get('worker')
должен быть либо int из worker
первичного ключа, либо сделать запрос перед проблемной строкой, чтобы найти экземпляр: 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)