0

私は2つのdjangoモデルを持っており、どちらも互いに関係はありませんが、共通のJIDを持っています(外部キーにはしていません):

class result(models.Model):
  rid = models.IntegerField(primary_key=True, db_column='RID') 
  jid = models.IntegerField(null=True, db_column='JID', blank=True)
  test_case = models.CharField(max_length=135, blank=True)

class job(models.Model):
  jid = models.IntegerField(primary_key = True, db_column='JID') 
  client_build = models.IntegerField(max_length=135,null=True, blank=True)

ORM でこの SQL クエリを実現したい: SELECT * FROM result JOIN job ON job.JID = result.JID

基本的に、2 つのテーブルを結合し、そのテーブルに対してフィルター クエリを実行したいと考えています。

ORM と Django は初めてです。

4

3 に答える 3

0

結果クラスを次のように変更することで、Djangoモデルで外部キーを表すことができます。

class result(models.Model):
  rid = models.IntegerField(primary_key=True, db_column='RID') 
  # jid = models.IntegerField(null=True, db_column='JID', blank=True)
  job = models.ForeignKey(job, db_column='JID', blank=True, null=True, related_name="results")
  test_case = models.CharField(max_length=135, blank=True)

(私はあなたが両方を追加する必要があるところを読みました、blank=Trueそしてnull=TrueDjangoで外部キーをオプションにするために、あなたは異なるオプションを試すかもしれません)。

これで、次のように書くだけで結果のジョブにアクセスできます。

myresult.job # assuming myresult is an instance of class result

パラメータrelated_name="results"を使用すると、Djangoによって新しいフィールドがクラスに自動的に追加されるため、次のjobように記述できます。

myjob.results

そして、ジョブの結果を取得しますmyjob

これは、JOINクエリを使用してDjango ORMによってフェッチされる必要があるという意味ではありません(おそらく代わりに別のクエリになります)が、コードの観点からは同じ効果があります(パフォーマンスの考慮事項は別として)。

models.ForeignKey詳細については、Djangoのドキュメントをご覧ください。

于 2013-03-08T03:15:13.573 に答える