0

我正在尝试减少 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,这是预期的结果。

4

1 回答 1

2

那不应该是:

parentorg = Parentorgs.objects.values_list("pk", flat=True)
contracts = Contracts.objects.filter(parentorg_id__in=parentorg)

你需要使用__in.

虽然老实说,这会给你同样的结果

Contracts.objects.all()

(看到parentorg不能为空......)

于 2013-06-16T15:08:48.930 回答