Python 如何创建一个;入住/退房;有时间戳的系统?

Python 如何创建一个;入住/退房;有时间戳的系统?,python,html,django,Python,Html,Django,我有一个类似于签入/签出方式的应用程序。人们只需输入他们的ID、区域,然后单击Checkin,它就会将时间戳和他们的信息发送到db。还有一个“签出”按钮,目前什么也不做。它的工作原理是,一旦用户填写表单并提交,它将执行以下操作之一: 根据输入的ID和区域查找上一个签入条目,并将签出从NULL更新为timestamp 如果该人员忘记以前签入,那么它将创建一个新记录,其中只包含签出时间戳和ID/区域 我认为通过匹配ID和区域来找到用户会更好,因为同一个人一天可以在不同区域签入/签出几次,因此仅通过I

我有一个类似于签入/签出方式的应用程序。人们只需输入他们的ID、区域,然后单击Checkin,它就会将时间戳和他们的信息发送到db。还有一个“签出”按钮,目前什么也不做。它的工作原理是,一旦用户填写表单并提交,它将执行以下操作之一:

  • 根据输入的ID和区域查找上一个签入条目,并将签出从NULL更新为timestamp
  • 如果该人员忘记以前签入,那么它将创建一个新记录,其中只包含签出时间戳和ID/区域
  • 我认为通过匹配ID和区域来找到用户会更好,因为同一个人一天可以在不同区域签入/签出几次,因此仅通过ID匹配可能会导致程序在某一点更新错误字段的问题

    型号.py

    class WorkArea(models.Model):
        name = models.CharField(max_length=50)
    
        def __str__(self):
            return self.name
    
    
    class StationNumber(models.Model):
        work_area = models.ForeignKey(WorkArea, on_delete=models.CASCADE)
        name = models.CharField(max_length=50)
    
        def __str__(self):
            return self.name
    
    
    class EmployeeWorkAreaLog(TimeStampedModel, SoftDeleteModel, models.Model):
        employee_number = models.IntegerField(max_length=50, help_text="Employee #", blank=False)
        work_area = models.ForeignKey(WorkArea, on_delete=models.SET_NULL, null=True, blank=False, help_text="Work Area", related_name="work_area")
        station_number = models.ForeignKey(StationNumber, on_delete=models.SET_NULL, null=True, help_text="Station", related_name="stations", blank=True)
        time_in = models.DateTimeField(auto_now_add=True, help_text="Time in", null=True, blank=True)
        time_out = models.DateTimeField(blank=True, help_text="Time out", null=True)
    
        def __str__(self):
            return self.employee_number
    
    class EnterExitArea(CreateView):
        model = EmployeeWorkAreaLog
        template_name = "operations/enter_exit_area.html"
        form_class = WarehouseForm
    
        def form_valid(self, form):
            form.save()
            return HttpResponseRedirect(self.request.path_info)
    
    
    def load_stations(request):
        work_area_id = request.GET.get('work_area')
        stations = StationNumber.objects.filter(work_area_id=work_area_id).order_by('name')
        return render(request, 'operations/station_number_dropdown_options.html', {'stations': stations})
    
    forms.py

    class WorkArea(models.Model):
        name = models.CharField(max_length=50)
    
        def __str__(self):
            return self.name
    
    
    class StationNumber(models.Model):
        work_area = models.ForeignKey(WorkArea, on_delete=models.CASCADE)
        name = models.CharField(max_length=50)
    
        def __str__(self):
            return self.name
    
    
    class EmployeeWorkAreaLog(TimeStampedModel, SoftDeleteModel, models.Model):
        employee_number = models.IntegerField(max_length=50, help_text="Employee #", blank=False)
        work_area = models.ForeignKey(WorkArea, on_delete=models.SET_NULL, null=True, blank=False, help_text="Work Area", related_name="work_area")
        station_number = models.ForeignKey(StationNumber, on_delete=models.SET_NULL, null=True, help_text="Station", related_name="stations", blank=True)
        time_in = models.DateTimeField(auto_now_add=True, help_text="Time in", null=True, blank=True)
        time_out = models.DateTimeField(blank=True, help_text="Time out", null=True)
    
        def __str__(self):
            return self.employee_number
    
    class EnterExitArea(CreateView):
        model = EmployeeWorkAreaLog
        template_name = "operations/enter_exit_area.html"
        form_class = WarehouseForm
    
        def form_valid(self, form):
            form.save()
            return HttpResponseRedirect(self.request.path_info)
    
    
    def load_stations(request):
        work_area_id = request.GET.get('work_area')
        stations = StationNumber.objects.filter(work_area_id=work_area_id).order_by('name')
        return render(request, 'operations/station_number_dropdown_options.html', {'stations': stations})
    
    我想我的问题更倾向于,我怎样才能实现这样的东西

    而且,当前签入会在提交时自动保存时间戳,但在按下签出区域按钮时不应更改时间戳,因为这会破坏其用途。

    l_userID=int()
    
    l_userID = int(<feed the user id>)
    l_areaID = <feed the area id>
    l_stationId  =<feed the station id>
    
    l_objLogEntry = EmployeeWorkAreaLog.objects.filter(employee_number=l_userID,\
                                                       work_area__id = l_areaID,\
                                                       station_number__id = l_stationId)\
                                               .exclude(time_out__isnull=True,\
                                                        time_out__exact='')
    if len(l_objLogEntry) == 0:
        #no login entry
    elif len(l_objLogEntry) == 1:
        #update the timestamp
    elif len(l_objLogEntry) > 1:
        #multiple open entries, do whatever
    
    l_区域ID= l_站ID= l_objLogEntry=EmployeeWorkAreaLog.objects.filter(employee_number=l_userID\ 工作区id=l区id\ 车站编号(id=l车站id)\ .exclude(time\u out\u isnull=True\ 超时(精确=“”) 如果len(l_objLogEntry)==0: #没有登录条目 elif len(l_objLogEntry)=1: #更新时间戳 elif len(l_objLogEntry)>1: #多个打开的条目,执行任何操作