Python Django中的奇数值列表和过滤器行为

Python Django中的奇数值列表和过滤器行为,python,django,django-models,Python,Django,Django Models,我试图减少Django应用程序中数据库的查询数量。我不想使用三个嵌套循环来执行大量的数据库查询,而是想使用前面介绍的方法 给定两个类,Parentorg class Parentorgs(models.Model): parentorg = models.IntegerField(primary_key=True, db_column = 'parentorg_id', unique = True) parentorgname = models.CharField(max_length=

我试图减少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)
合同

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获取所需的主键,但是
合同
是一个空列表

如果我用
all
替换
filter(parentorg\u id=parentorg).values\u list(“pk”,flat=True)
,我会从
合同中获得700多个结果,这是预期的结果。

这不应该是:

parentorg = Parentorgs.objects.values_list("pk", flat=True)
contracts = Contracts.objects.filter(parentorg_id__in=parentorg)
您需要在
中使用
\u

虽然说实话,这会给你和以前一样的结果

Contracts.objects.all()
(视为
parentorg
不能为空…)