0

Django アプリでデータベースに対するクエリの数を減らそうとしています。ネストされた 3 つのループを使用してかなりの数のデータベース クエリを実行するのではなく、説明された方法を使用したいと思います。

2 つのクラスを指定すると、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