Django Query-获取不在另一个模型的FK中的列表

Django Query-获取不在另一个模型的FK中的列表,django,django-models,django-queryset,Django,Django Models,Django Queryset,我正在开发一个django web应用程序,它根据完成的报告管理工资单,然后生成工资单。3个模型如下。(我试图将问题所需的数据限制在这一范围内) 获取所有不在PayrollItem中的薪资记录的最有效方法是什么。因此,我可以选择它们来创建工资单项目 有10万条记录,我的第一次尝试需要几分钟。尝试如下(这远不可行) 由于您在PayrollItem中有相关字段record,因此在筛选PayRecord时,您可以进入该模型。使用\uu isnull应该可以满足您的需求 PayRecord.object

我正在开发一个django web应用程序,它根据完成的报告管理工资单,然后生成工资单。3个模型如下。(我试图将问题所需的数据限制在这一范围内)

获取所有不在PayrollItem中的薪资记录的最有效方法是什么。因此,我可以选择它们来创建工资单项目

有10万条记录,我的第一次尝试需要几分钟。尝试如下(这远不可行)


由于您在
PayrollItem
中有相关字段
record
,因此在筛选
PayRecord
时,您可以进入该模型。使用
\uu isnull
应该可以满足您的需求

PayRecord.objects.filter(payrollitem__isnull=True)
转换为sql语句,如:

SELECT payroll_payrecord.id, 
   payroll_payrecord.rate, 
   payroll_payrecord.user_id
FROM payroll_payrecord
   LEFT OUTER JOIN payroll_payrollitem 
       ON payroll_payrecord.id = payroll_payrollitem.record_id
WHERE payroll_payrollitem.id IS NULL
根据您的意图,您可能希望链接到
。选择\u related
()

也就是说:

SELECT payroll_payrecord.id,
       payroll_payrecord.rate,
       payroll_payrecord.user_id,
       payroll_user.id,
       payroll_user.name
FROM payroll_payrecord
         LEFT OUTER JOIN payroll_payrollitem
             ON (payroll_payrecord.id = payroll_payrollitem.record_id)
         INNER JOIN payroll_user
             ON (payroll_payrecord.user_id = payroll_user.id)
WHERE payroll_payrollitem.id IS NULL

哇,从分钟到一秒钟左右,在一个快速点击。很好,这正是我所需要的,我没有意识到我可以用这种方式进行反向查询。是的,它非常有用,您可以通过连接继续返回。请参见,您也可以使用
相关名称
来命名链接,使其在某些情况下更有用。
SELECT payroll_payrecord.id, 
   payroll_payrecord.rate, 
   payroll_payrecord.user_id
FROM payroll_payrecord
   LEFT OUTER JOIN payroll_payrollitem 
       ON payroll_payrecord.id = payroll_payrollitem.record_id
WHERE payroll_payrollitem.id IS NULL
PayRecord.objects.filter(payrollitem__isnull=True).select_related('user')
SELECT payroll_payrecord.id,
       payroll_payrecord.rate,
       payroll_payrecord.user_id,
       payroll_user.id,
       payroll_user.name
FROM payroll_payrecord
         LEFT OUTER JOIN payroll_payrollitem
             ON (payroll_payrecord.id = payroll_payrollitem.record_id)
         INNER JOIN payroll_user
             ON (payroll_payrecord.user_id = payroll_user.id)
WHERE payroll_payrollitem.id IS NULL