django结合查询结果并对postgres上的组合查询结果进行查询

时间:2017-12-09 13:59:20

标签: python django postgresql django-queryset

我正在尝试完成一个查询,以确定一天内结账的签到和签到次数,这对于员工而言是唯一的,无需重复签入和结帐,并选择最新的不同。

本质上是组合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"}
  1. 问题1在这里:
  2. 我想要结合这两个查询

    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"}
    
    1. 问题2在这里:
    2. 然后根据activity_type = 1(CHECKIN)的结果和activity_type = 2(CHECKOUT)的结果进行查询

      问题在于上面,我如何组合2个查询结果,并根据上述要求对组合查询进行查询。

1 个答案:

答案 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
)

这只会导致单个数据库查询。