2011-03-30 2 views
0

정기적으로 평가되는 거래자가 있습니다. 평가에는 상인에 대한 외래 키가 있습니다. 모든 거래자를 현재 평가 상태와 함께 나열하고 싶습니다. 이는 Trader 모델에 추가 된 맞춤 속성을 사용하여 가능합니다. 그러나 최신 평가 상태 (예 : 아직 열려있는 모든 현재 평가)에 대한 결과를 필터링 할 수 있기를 원합니다. 그러나 이전에 (Custom properties in a query) 표시된 것처럼 사용자 지정 모델 속성을 쿼리에 포함 할 수 없습니다.하위 모델의 최신 레코드를 쿼리에 포함시키는 방법

Trader 모델에 외래 키를 만들었지 만 가장 최근의 Evaluation의 ID를 기록하는 것은 가능하지 않습니다. 모델이 서로를 참조하고 순환 순서 문제가 발생하기 때문에 가능하지 않습니다. Trader는 평가를 말하지만 평가는 아직 선언되지 않았거나 평가를 먼저 수행하지만 Trader는 선언되지 않습니다.

지금까지 Trader를 기본 쿼리로 사용하고 Evaluations를 조회한다고 가정했습니다. 문제를 해결할 대안은 평가를 기반으로 쿼리를 만든 다음 대신 Traders를 조회하는 것입니다. 그러나 이것은 아직 평가되지 않은 트레이더가 결코 결과에 나타나지 않는다는 것을 의미합니다 (트레이더가 항상 최소한 하나의 평가 레코드를 보유하고 있지 않은 한). 또는 원시 SQL 사용에 의지 할 수 있습니다.

이 문제를 해결하는 방법에 대한 제안은 크게 감사하겠습니다.

Class Trader(models.Model): 
    territory = models.ForeignKey(Territory) 
    organisation_name = models.CharField(max_length=30) 
    contact_title = models.CharField(choices=TITLE_CHOICES, max_length=4) 
    contact_forename = models.CharField(max_length=30, blank=True) 
    contact_lastname = models.CharField(max_length=30) 
    ... 

    def _get_current_evaluation(self): 
     return Evaluation.objects.filter(trader=self).latest('open_date') 

    current_evaluation = property(_get_current_evaluation) 

Class Evaluation(models.Model): 
    trader = models.ForeignKey(Trader) 
    open_date = models.DateField("Open Date", null=True, blank=True) 
    rated_date = models.DateField("Rated Date", null=True, blank=True) 
    closed_date = models.DateField("Closed Date", null=True, blank=True) 
    status = models.ForeignKey(RatingStatus, null=True, blank=True) 
    ... 

답변

0

http://docs.djangoproject.com/en/dev/ref/models/querysets/#latest
http://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by

"나는 현재 평가 상태 함께 모든 상인을 나열합니다."여기

는 모델입니다

"

traders = Trader.objects.all() 

{% for trader in traders %} 
    {{ trader }} : {{ trader.evaluation_set.latest.status|default:"Not Evaluated" }} 
{% endfor %} 
그러나, 나는 최신 평가의 상태에 결과를 필터링 할 수 있어야합니다 (예를 들어, 여전히 열려 을 모두 그 현재의 평가) . "

"나는 평가를 기반으로 쿼리 를 만든 다음 대신 트레이더를 조회하는 것 에게 주변의 문제를 얻기 위해 대안을 생각했다. 그러나,이 을 의미 아직 평가되지 않았습니다 그 상인, 것 결과에 나타나지 않습니다. ( 거래자는 항상 적어도 하나의 평가 기록이 있습니다.) "

evaluation_status = open로 필터링하는 경우 어쨌든 평가되지 않은 거래자는 얻을 수 없습니다.

그렇게 :

status = RatingStatus.get(status='open') 
traders_with_open_evals = Traders.objects.filter(evaluation__status=status).distinct() 

이 정말 필요는 없지만 참조 용 : 나는 상인 모델에서 외래 키를 만든 것

, 그 해당 ID를 기록 다음은 입니다. 다음은입니다.다른, 그리고 이 클래스를 만들 때 다음이 원형 순서의 문제에 들어가, 즉 상인 평가에 의미하지만, 평가 먼저 아직 선언, 또는 평가를 가하고되지 않은, 아직 상인 선언 는 없습니다. http://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey

아직 정의되지 않은 모델에 관계 를 작성해야하는 경우

, 오히려 모델 객체 보다는 모델의 이름을 사용할 수 있습니다 자체 :

class Car(models.Model): 
    manufacturer = models.ForeignKey('Manufacturer') 
    # ... 

class Manufacturer(models.Model): 
    # ... 

다른 응용 프로그램에 정의 된 모델을 참조하려면 응용 프로그램 레이블이있는 모델을 명시 적으로 지정할 수 있습니다. 제조업체 모델이 위의 에 정의되어있는 경우 예를 들어, 생산이라는 다른 응용 프로그램 당신은 사용해야 할 것 :

class Car(models.Model): 
    manufacturer = models.ForeignKey('production.Manufacturer') 

는 참조 이런 종류의 유용 수 있습니다 원형 수입 을 해석 할 때 두 응용 프로그램 간의 종속성.

+0

감사합니다. 내 상거래 모델에 현재 상태를 추가하면 효과가있었습니다. 내가 너에게 추가 사항을 보았지만 ... – alj