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
。これは予想どおりです。