2012-01-12 9 views
1

私は最近、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ではありませんでした。

何か吹き飛ばす間違いや悲惨さを許してください。これは私の最初の投稿です!

答えて

2

related_objectにアクセスする必要があります。それは非常に簡単です。

まず、ここrelated_nameを追加:あなたはstatusesにアクセスするときに、DBにヒットしない場合

class Status(models.Model): 
    testmatrixid = models.ForeignKey(Testmatrix, db_column='TestMatrixId', related_name='statuses') 

今、あなたは

test_matrix.statuses.all() 

のような希望Testmatrixためのすべてのステータスを取得することができ、 select_relatedを使用することを忘れないでください。

+0

ありがとう!これは機能します。私は最後のマイルを逃しました:逆の外部キーのルックアップのための "related_name"。 – rajivRaja

0

特定のエラーメッセージがなければ、エラーの原因を診断することは困難です。しかし、あなたの例では、views.get_products:tm = list(Testmatrix.objects.filter(productid='abc'))は、 'abc'が文字列であり、productidが実際にProductオブジェクト(整数だけでなく、参照テーブルの整数外部キーでもpk); tm = list(Testmatrix.objects.filter(productid=Product.objects.get(product_name='abc'))を実行することができます.'abc 'は製品レコードの製品名です。フィールドをmodels.ForeignKey(...)に設定すると、参照レコードはidではなくオブジェクトとして扱われます。

それ以外は、何も鳴らず、あなたのテンプレートは見た目がよく、モデルは私にとってうまく見えます。私はいくつかのテストケースを作成して、エラーがどこにあるか確認することをお勧めします:Django Testing;また、thisはTDDとDjangoの単体テストを理解するのに最適なチュートリアルです。 unittestを使用すると、アプリケーションのあらゆるステップを検証し、保証付きで将来のアップデートを行うことができます。

+0

外部キーのデータ型(整数とオブジェクト)の違いを明確にしてくれてありがとうございます。私はそのようなエラーは出ませんでしたが、空のクエリーセットを取得していました。私はDjango単体テストについても読み上げます - これは自己学習者にとって貴重なアドバイスです。ありがとう! – rajivRaja

関連する問題