You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Django的detail_break函数以获取指定日期的用户休息数据?

问题描述

需要修改Django中的detail_break视图函数,使其仅返回指定日期的当前用户休息数据,而非该用户的全部历史休息记录。需通过关联Attendance模型的attendance_date字段实现日期过滤。

现有模型定义

class Employee(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, default=1,related_name='Employee')
    eid = models.IntegerField(primary_key=True)
    salary = models.IntegerField(null=True, blank=True)
    gender = models.CharField(max_length=6, choices=GENDER_CHOICES, default=1)
    contactno = models.CharField(max_length=10, blank=False)
    email = models.CharField(max_length=50 ,null=True, blank=True)
    country = models.CharField(max_length=30)
    address = models.CharField(max_length=60)

    def __str__(self):
        return self.user.first_name  + '_' +  self.user.last_name


class Attendance(models.Model):
    employee = models.ForeignKey(Employee, on_delete=models.CASCADE, default=1,related_name='Attendance')
    attendance_date = models.DateField(null=True)
    in_time = models.TimeField(null=True)
    out_time = models.TimeField(null=True ,blank=True)
    description = models.TextField(null=True, blank=True)

    def __str__(self):
        return str(self.employee) + '-' +  str(self.attendance_date)


class Breaks(models.Model):
    employee = models.ForeignKey(Employee, on_delete=models.CASCADE, default=1)
    break_in = models.TimeField(null=True, blank=True)
    break_out = models.TimeField(null=True, blank=True)
    attendance =models.ForeignKey(Attendance, on_delete=models.CASCADE, default=1,related_name='Breaks')
    
    def __str__(self):
        return str(self.employee) + '-' + str(self.break_in) + '-' + str(self.break_out)

当前视图函数

def detail_attendance(request):
    attendance_list = Attendance.objects.filter(employee__user_id=request.user.id)
    counter = Counter()
    return render(request, 'employee/detail_attendance.html', {'attendance_list': attendance_list, 'counter': counter})


def detail_break(request):
    break_list=Breaks.objects.filter(employee__user_id=request.user.id )
    return render(request, 'employee/detail_break.html', {'break_list': break_list})
解决方案

利用Django ORM的跨表查询能力,通过Breaks关联的Attendance外键过滤指定日期的记录,具体修改如下:

from django.utils.dateparse import parse_date
from datetime import date

def detail_break(request):
    # 从GET参数中获取目标日期,默认返回当天数据
    target_date = request.GET.get('date')
    target_date = parse_date(target_date) or date.today()

    # 结合用户ID和日期过滤休息记录
    break_list = Breaks.objects.filter(
        employee__user_id=request.user.id,
        attendance__attendance_date=target_date
    )
    return render(request, 'employee/detail_break.html', {'break_list': break_list})

说明

  1. 前端可通过?date=YYYY-MM-DD格式的GET参数指定查询日期,若未传递参数则默认查询当天数据
  2. 使用attendance__attendance_date双下划线语法实现跨表关联查询,直接过滤关联考勤记录的日期字段
  3. parse_date用于将字符串日期转换为Django可识别的date类型,确保格式兼容

内容的提问来源于stack exchange,提问作者Nishant Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:20:49