2012-03-19 2 views
1

의 가정하자, 나는 모델은 닭이라고 한 :Django : 뷰에서 역방향 관계 목록에 액세스하는 방법?

class Chicken(models.Model): 
    name = models.CharField(max_length=30) 

을 나는 또한 치킨 모델에 외래 키가있는 모델이라고 달걀이 :

class Egg(models.Model): 
    chicken = models.ForeignKey(Chicken) 
    layed_on = models.DateField(auto_add_now=True) 

지금 나는를 만들려면을 모든 닭의 목록과 마지막 달걀을 낳은 날짜가 포함 된보기.

나는 같은 것을 사용하여 닭으로 누워 모든 계란을 얻는 방법을 알고

c = Chicken.objects.get(name='Henry') 
e = c.egg_set.all() 

을하지만 닭을 많이 가지고 있기 때문에 그건 정말, 도움이되지 않습니다와 나는 단지를 얻으려면 그들의 최신 알의 날짜. 또한 계란 정보를 쉽게 볼 수 있도록 내 의견에 알리는 방법을 모르겠습니다.

{% for chicken in chickens %} 
    <p>{{ chicken.name }} layed is last egg on {{ chicken.last_egg }}</p> 
{% endfor %} 

이 아마 아주 기본적인 질문이지만, 난 그냥 초보자 그리고 난 크게 줄 수있는 모든 도움을 주셔서 감사합니다 : 내 생각에 나는 같은 것을 할 싶습니다. 장고 문서는이 경우에 정말로 도움이되지 않습니다.

+0

모든 알을 낳는 날짜를 정말로 알아야합니까? 그렇지 않으면 치킨이 달걀을 낳을 때마다 업데이트되는 치킨 모델에 필드를 유지할 수 있습니다. –

+0

네, 제 실제 응용 프로그램 (닭에 관한 것은 아닙니다)에서 가장 최근의 날짜보다 더 많은 정보가 필요하기 때문에 치킨 모델에이 모든 필드를 추가하고 싶지 않습니다. – user1136324

답변

4

당신이 찾고있는 것은 django의 주석 feature입니다. 기본적으로 계란의 layed_on 필드 Max으로 닭의 각 행에 주석을 달고 싶습니다. 나 앞에서 즉각적인 대답이 없으면 아래의 진술을 정확하게 말할 수는 없지만 출발점을 알려 주어야합니다. 이 같은

을 편집 닭 모델 :

class Egg(models.Model): 
    chicken = models.ForeignKey(Chicken, related_name='eggs') 
    layed_on = models.DateField(auto_add_now=True) 

from django.db.models import Max 
Chicken.objects.annotate(last_egg=Max('eggs__layed_on')) 
+0

이것이 내가 원하는 것 같습니다. 불행히도 egg_set에서는 작동하지 않습니다. FieldError : "키워드 'egg_set'을 필드로 확인할 수 없습니다." – user1136324

+0

위의 편집을 참조하십시오. 병아리 외래 키에 related_name을 사용하십시오. related_name = 'eggs', 이제 egg_set을 사용하는 대신에 eggs를 사용하십시오. –

0

개인적으로 @property 주석으로 내 모델 방법을 주석 이러한 문제를 해결하기 좋아한다.

예 :

@property 
def last_egg(self): 
    return self.egg_set.order_by('-layed_on')[0] 

그리고 템플릿, 당신은 정규 모델 필드로 사용할 수 있습니다 귀하의 치킨 모델에서, 당신은 방법과 같은 것이다.

{{my_chicken.last_egg}} 

이 솔루션에 대한 문제가 있는지, 그리고 어떻게 생각하는지 알고 싶습니다. 어쩌면 우리는이 문제를 엘레강하게 해결하는 방법에 대해 좋은 질문을 할 수있을 것입니다.

희망이 있습니다.

관련 문제