2012-01-12 4 views
1

저는 최근 10 년 전에 작성된 고풍 웹 응용 프로그램을 마이그레이션하기 위해 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) 

(해당 모델이 생성 된 참고 : 나는 지난 몇 일 동안 장고 문서를 읽고,하지만 멀티 테이블 데이터베이스 내 경우에 참여 달성하기 위해 최선의 방법을 알아낼 수 없었다 및 inspectdb에 의해 나는

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}) 

템플릿 (보기/모델)의 실제 문제에 초점을 돕기 위해이 시점에서 최소화하도록 설계)이 시점에서 수정하지 않으려는 것입니다.

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 및 테스트 케이스 모델을 가입 할 수 있어요하지만

, 내가 말 제품 ID = 'ABC에 TestMatrix, TestCase에, 상태 기록을 모두 결합하여 등가의 검색어를 생성 할 수 없습니다입니다

1) 사용이 Testmatrix 및 테스트 케이스 및 제품 테이블 간의 select_related 모든 세 가지 모델에서 속성에 액세스 할 수 있었다 (testmatrixi : '

나는 다음과 같은 시도 d, productid, productname, testcaseid, testcasename). 그러나이 자동 외래 키 상태 모델을 참조하는 확장하는 방법을 잘 모르겠습니다. 모든 외부 키가 Testmatrix 자체 내에서 정의 되었다면 더 쉬울 것입니다. 그러나 Status에는 TestMatrix에 대한 외래 키가 있습니다.

2) 항목 = Status.objects.filter (testmatrixid__productid = pid)와 같은 것을 사용해 보았습니다. 이것은 Testmatrix와 Status에 합류 한 결과로 queryset을 다시 주었지만 Testcases는 반환하지 않았습니다.

눈부신 실수 나 불쾌감을 용서하십시오. 이것은 나의 첫 번째 게시물입니다!

답변

2

related_object에 액세스해야합니다. 그것은 매우 간단합니다.

첫째, 여기 related_name을 추가

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

지금 당신이

test_matrix.statuses.all() 

처럼 원하는 Testmatrix에 대한 모든 상태를 얻을 수 있습니다 당신은 당신이 statuses에 액세스 할 때, DB에 충돌하지 않으려면, select_related을 반드시 사용하십시오.

+0

감사합니다. 이 작동합니다. 나는 마지막 마일을 놓쳤다 : reverse foreign key looks를위한 "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 및 단위 테스트를 이해하는 데 유용한 자습서이기도합니다. unittest를 사용하면 응용 프로그램의 모든 단계를 검증하고 향후 보증을 통해 업데이트 할 수 있습니다.

+0

외래 키의 데이터 형식 (정수 대 개체)의 차이점을 명확히 해 주셔서 감사합니다. 나는 그런 오류를 얻지 못했지만 빈 querysets []를 얻고 있었고 지금까지 왜 그런지 말할 방법을 찾을 수 없었습니다. Django unit tests에 대해서도 읽어 볼 것입니다. 이것은 자기 학습자에게 매우 귀중한 권고입니다. 감사! – rajivRaja

관련 문제