У меня есть модель, которая отслеживает время входа / выхода. Я пытаюсь добавить ограничения, чтобы сделать данные более точными. В настоящее время, когда кто-то «входит», он создает запись, сохраняет время в метке времени и затем перенаправляет. Если человек затем пытается войти снова, он создает новую запись с новой отметкой времени.
Что я пытаюсь добавить сейчас, так это то, что, если у человека есть предыдущая запись без отметки времени выхода, эта запись (которая будет второй последней записью) будет помечена путем обновления time_exceptions для поля 'N'.
В настоящее время все поля заменяются на 'N', независимо от того, есть ли выход или нет, как показано ниже.
class EnterExitArea(CreateView):
model = EmployeeWorkAreaLog
template_name = "operations/enter_exit_area.html"
form_class = WarehouseForm
def form_valid(self, form):
emp_num = form.cleaned_data['employee_number']
area = form.cleaned_data['work_area']
station = form.cleaned_data['station_number']
if 'enter_area' in self.request.POST:
form.save()
EmployeeWorkAreaLog.objects.filter((Q(employee_number=emp_num) & Q(work_area=area) & Q(time_out__isnull=True) & Q(time_in__isnull=True)) & (Q(station_number=station) | Q(station_number__isnull=True))).update(time_in=datetime.now())
if EmployeeWorkAreaLog.objects.filter(Q(employee_number=emp_num)).count() > 1:
EmployeeWorkAreaLog.objects.filter((Q(employee_number=emp_num) & Q(work_area=area) & Q(time_out__isnull=True)) & (Q(station_number=station) | Q(station_number__isnull=True))).update(time_exceptions='N')
return HttpResponseRedirect(self.request.path_info)
Я попробовал следующее, но я получаю expected string or bytes-like object
, и, хотя он все еще создает новую запись перед сбоем, он не обновляет time_exceptions второй до самой последней до N.
if 'enter_area' in self.request.POST:
form.save()
EmployeeWorkAreaLog.objects.filter((Q(employee_number=emp_num) & Q(work_area=area) & Q(time_out__isnull=True) & Q(time_in__isnull=True)) & (Q(station_number=station) | Q(station_number__isnull=True))).update(time_in=datetime.now())
if EmployeeWorkAreaLog.objects.filter(Q(employee_number=emp_num) & Q(time_out__isnull=True) & Q(time_exceptions="")).count() > 1:
recent = EmployeeWorkAreaLog.objects.filter(employee_number=emp_num, work_area=area, station_number=station, time_out__isnull=True).order_by('-time_in')[1]
EmployeeWorkAreaLog.objects.filter((Q(employee_number=emp_num) & Q(work_area=area) & Q(time_in=recent) & Q(time_out__isnull=True)) & (Q(station_number=station) | Q(station_number__isnull=True))).update(time_exceptions='N')
return HttpResponseRedirect(self.request.path_info)