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
我正在开发一个 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