我正在尝试完成一个查询,以确定一天内结账的签到和签到次数,这对于员工而言是唯一的,无需重复签入和结帐,并选择最新的不同。
本质上是组合2查询结果,并对结果执行查询。
下面更容易解释。
我有2个型号:
class Employee(models.Model):
fullname = models.CharField(max_length=30, blank=False)
class Attendance(models.Model):
CHECKIN = 1
CHECKOUT = 2
ATTENDANCE_TYPE_CHOICES = (
(CHECKIN, "Check In"),
(CHECKOUT, "Check Out"),
)
employee = models.ForeignKey(Employee)
activity_type = models.IntegerField(choices = ATTENDANCE_TYPE_CHOICES, default=CHECKIN)
timestamp = models.DateTimeField(auto_now_add=True)
我有2个查询,以获得出席人员的唯一CheckIn和CheckOut。
unique_employee_attendance_checkin_today = Attendance.objects.filter(company=auth_employee.employee.company.id,
activity_type=Attendance.CHECKIN,
timestamp__date = today).order_by(
'employee_id','-timestamp').distinct('employee_id')
unique_employee_attendance_checkout_today = Attendance.objects.filter(company=auth_employee.employee.company.id,
activity_type=Attendance.CHECKOUT,
timestamp__date = today).order_by(
'employee_id','-timestamp').distinct('employee_id')
假设我有这些记录
Employee
{"id":1, "employee":"michael jackson",
"id":2, "fullname":"mariah carey",
"id":3, "fullname":"taylor swift"}
Attendance
{"id":1, "employee": 1,"activity_type": 1, timestamp: "2017-12-05 09:08",
"id":2, "employee": 2,"activity_type": 1, timestamp: "2017-12-05 10:13",
"id":3, "employee": 3,"activity_type": 1, timestamp: "2017-12-05 11:30",
"id":4, "employee": 2,"activity_type": 2, timestamp: "2017-12-05 15:13",
"id":5, "employee": 3,"activity_type": 2, timestamp: "2017-12-05 18:30",
"id":6, "employee": 2,"activity_type": 1, timestamp: "2017-12-05 19:13",
"id":7, "employee": 1,"activity_type": 2, timestamp: "2017-12-06 08:08"}
unique_employee_attendance_checkin_today - 将输出此结果
{"id":4, "employee": 2,"activity_type": 2, timestamp: "2017-12-05 15:13",
"id":5, "employee": 3,"activity_type": 2, timestamp: "2017-12-05 18:30"}
unique_employee_attendance_checkout_today - 将输出此结果
{"id":1, "employee": 1,"activity_type": 1, timestamp: "2017-12-05 09:08",
"id":6, "employee": 2,"activity_type": 1, timestamp: "2017-12-05 19:13"}
我想要结合这两个查询
unique_employee_attendance_checkin_today + unique_employee_attendance_checkout_today
和
我想为员工创建一个独特的,它将删除2条记录,因此输出结果将是这样的。
{"id":1, "employee": 1,"activity_type": 1, timestamp: "2017-12-05 09:08",
"id":5, "employee": 3,"activity_type": 2, timestamp: "2017-12-05 18:30"
"id":6, "employee": 2,"activity_type": 1, timestamp: "2017-12-05 19:13"}
然后根据activity_type = 1(CHECKIN)的结果和activity_type = 2(CHECKOUT)的结果进行查询
问题在于上面,我如何组合2个查询结果,并根据上述要求对组合查询进行查询。
答案 0 :(得分:1)
合并后的查询(每个员工的最新出勤率/日期,无论类型如何)都可以完全退出activity_type
:
unique_employee_attendance_today = Attendance.objects.filter(
company=auth_employee.employee.company.id,
timestamp__date = today).order_by(
'employee_id','-timestamp'
).distinct('employee_id')
现在,您可以在嵌套查询中过滤掉该组中的签到,例如:
Attendance.objects.filter(
id__in=unique_employee_attendance_today,
activity_type=Attendance.CHECKIN
)
这只会导致单个数据库查询。