私は最近、10年前に書かれた古風なWebアプリケーションを移行するためのDjangoの評価を開始しました。私は最後の数日間Djangoのドキュメントを読んでいましたが、マルチテーブルデータベースは、私の場合は参加を達成するための最良の方法を把握することができていない:外部キーを使用したDjangoの3者結合
Model:
class Product(models.Model):
productid = models.IntegerField(primary_key=True, db_column='ProductId')
productname = models.CharField(max_length=120, db_column='ProductName')
class Testcases(models.Model):
testcaseid = models.IntegerField(primary_key=True, db_column='TestCaseId')
testcasename = models.CharField(max_length=240, db_column='TestCaseName')
class Testmatrix(models.Model):
testmatrixid = models.IntegerField(primary_key=True, db_column='TestMatrixId')
productid = models.ForeignKey(Product, db_column='ProductId')
testcaseid = models.ForeignKey(Testcases, db_column='TestCaseId')
class Status(models.Model):
testmatrixid = models.ForeignKey(Testmatrix, db_column='TestMatrixId')
title = models.CharField(max_length=240, db_column='Title', blank=True)
(モデルが生成されたことに注意してください
View: from django.shortcuts import render_to_response from mysite.testmatrix.models import Product, Testcases, Testmatrix, Status def get_products(request): tm = list(Testmatrix.objects.filter(productid='abc')) return render_to_response('products.html', {'tm': tm})
)inspectdbで、私はこの時点でそれを変更しないことを好むだろうテンプレートは、(ビュー/モデル)での本当の問題に焦点を当てるために、この時点では最小限になるように設計されています。
Template: (products.html)
{% extends "main.html" %}
{% block body %}
<table>
{% for tm in tm %}
<tr>
<td>{{ tm.testmatrixid }}</td>
<td>{{ tm.testcaseid.testcasename }}</td>
</tr>
{% endfor %}
</table>
{% endblock %}
問題:私はTestmatrixとテストケースのモデルに参加することができるよものの
は、私が言うのProductID = 'ABCにTestMatrix、テストケース、ステータスのすべてのレコードを結合することにより同等のクエリセットを生成することができません「
私は次のことを試してみました:
1)使用しTestmatrixとテストケースと商品テーブル間のselect_relatedと3つのすべてのモデル間での属性にアクセスすることができました(testmatrixi d、productid、productname、testcaseid、testcasename)。しかし私は、この自動外部キーをどのようにしてStatusモデルを参照するのかをよく分かりません。これは、すべての外部キーがTestmatrix内で定義されていれば、より簡単になりました。しかし、StatusにはTestMatrixへの外部キーがあります。
2)私は何かを使ってみました:entries = Status.objects.filter(testmatrixid__productid = pid)。これは、TestmatrixとStatusに参加した結果、私にクエリーセットを与えましたが、Testcasesではありませんでした。
何か吹き飛ばす間違いや悲惨さを許してください。これは私の最初の投稿です!
ありがとう!これは機能します。私は最後のマイルを逃しました:逆の外部キーのルックアップのための "related_name"。 – rajivRaja