2009-10-13 6 views
1

제거 중복 관련 항목 :장고 - 여기 내 응용 프로그램에서 코드 조각의

class PortolioItem(models.Model): 
    ... 
    user = models.ForeignKey(User) 
    contract = models.ForeignKey(Contract) 
    quantity = models.IntegerField(...) 
    ... 

class Contract(models.Model): 
    ... 
    market = models.ForeignKey(Market) 
    ... 

당신은 사용자가 자신이 소유 한 다른 계약의 수 PortfolioItems 동일한 번호를 가지고 있음을 알 수있다.

포트폴리오에 특정 "시장"의 "계약"이있는 사용자에게 전자 메일을 보내고 싶습니다. 그리고 나는 그가 소유하고있을 수있는 시장의 계약의 종류에 관계없이 사용자에게 한 번만 이메일을 보내고 싶습니다. 여기에 내가 무엇 : 사용자가 같은 시장의 계약의 다른 유형을 가질 수 있기 때문에

#get users that want to receive notices 
users = User.active_users.investment_notices_users() 
#get portfolio items for a specific market 
market = Market.objects.get(pk=1) 
portfolio_items = PortfolioItem.objects.filter(contract__in = market.contracts.all(), user__in = users) 

은 검색어 세트 한 번 이상 사용자를 포함 할 수있다. 몇 가지 방법으로 중복 된 사용자를 제거 할 수 있습니다 (쉬운 해결책은 queryset -> list -> set -> list).하지만 비효율적 인/비 우아한 솔루션에 있을지 궁금해 할 수 있습니다. ORM 방법은 고유 한 사용자 쿼리 세트를 제공합니다.

미리 감사드립니다. 당신은 단지 사용자가 원하는 경우

+0

은 관리자의 일종 investment_notices_users''인가? 그것이 어떻게 정의되는지보기에 도움이 될 수 있습니다. –

+0

예, 상당히 기본이며 관련 부울 필드가 true로 설정된 사용자를 반환합니다. return self.filter (userprofile__receives_investment_notices = True) – shanyu

답변

1

후 가장 좋은 방법은 사용자 테이블로 시작하는 것입니다

users = User.objects.filter(portfolioitem__contract__market=market) 
+0

관련 집합을 사용하여 필터링 할 수 있습니까? 그것은 내가 찾고 있던 것이고 그것의 존재를 알지 못했습니다. ORM 워드 프로세서에이 점에 대해 언급 한 내용이 있습니까? – shanyu

+0

예, 물론입니다. 여기를보십시오 : http://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships –

+0

내가 어떻게 그 부분을 간과했는지 궁금합니다. – shanyu

관련 문제