我正在尝试减少 Django 应用程序中数据库的查询数量。我不想使用三个嵌套循环来执行相当多的数据库查询,而是使用向我描述的方法。
给定两个类,Parentorg
class Parentorgs(models.Model):
parentorg = models.IntegerField(primary_key=True, db_column = 'parentorg_id', unique = True)
parentorgname = models.CharField(max_length=100L, db_column='ParentOrg', unique = True) # Field name made lowercase.
eff_date = models.DateField()
exp_date = models.DateField(null=True, blank=True)
和Contracts
class Contracts(models.Model):
parentorg = models.ForeignKey("Parentorgs")
contractnum = models.CharField(max_length=10L, db_column='ContractNum', primary_key = True)
eff_date = models.DateField()
exp_date = models.DateField(null=True, blank=True)
contractname = models.CharField(max_length=100L, db_column='ContractName')
我想获得与基于主外键关系的表之间的 SQL 内连接相同的结果。目前,我正在这样做
for d in Parentorgs.objects.all():
for e in Contracts.objects.filter(parentorg_id = e.parentorg) :
如您所见,这是非常低效的,并且给数据库带来了相当大的负载。
作为替代方案,我尝试过
parentorg = Parentorgs.objects.values_list("pk", flat = True)
contracts = Contracts.objects.filter(parentorg_id = parentorg).values_list("pk", flat = True)
这会从 Parentorgs 获取预期的主键,但contracts
它是一个空列表。
如果我用 替换filter(parentorg_id = parentorg).values_list("pk", flat = True)
,all
我会得到 700+ 个结果Contracts
,这是预期的结果。