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

Django Query - Get list that isnt in FK of another model

我正在开发一个 django 网络应用程序,它根据已完成的报告管理工资单,然后生成工资单。 3款车型如下。 (我试图限制问题所需的数据)。

class PayRecord(models.Model):
    rate = models.FloatField()
    user = models.ForeignKey(User)

class Payroll(models.Model):
    company = models.ForeignKey(Company)
    name = models.CharField()

class PayrollItem(models.Model):
    payroll = models.ForeignKey(Payroll)
    record = models.OneToOneField(PayRecord, unique=True)

获取不在 PayrollItem 中的所有 PayRecords 的最有效方法是什么。所以我可以 select 他们创建一个工资项目。

有 10 万条记录,我最初的尝试需要几分钟。下面尝试尝试(这远非可行)。

records_completed_in_payrolls = [
        p.report.id for p in PayrollItem.objects.select_related(
                'record',
                'payroll'
        )
    ]

因为您在 PayrollItem 中有相关字段 record,所以您可以在筛选 PayRecord 时访问该模型。使用 __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

根据您的意图,您可能想要链接 .select_related (https://docs.djangoproject.com/en/3.1/ref/models/querysets/#select-related)

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