2012-06-27 3 views
3

Article 모델과 관련된 Read 모델이 있습니다. 제가하고 싶은 것은 기사가 유일하고 date_added에 의해 주문 된 쿼리 세트를 만드는 것입니다. postgres를 사용하고 있으므로 .distinct() 메서드를 사용하고 article 필드를 지정하는 것이 좋습니다. 이와 같이 :Django .order_by()와 .distinct() postgres 사용

그러나 이것은 원하는 결과를 얻지 못하고 생성 된 순서대로 쿼리 세트를 정렬합니다. Django의 설명서에서 .distinct().order_by()에 대한 참고 사항을 알고 있지만 부작용이 있기 때문에 복제본이있을 것이며 여기에는 적용되지 않는다는 것을 알지 못합니다.

# To actually sort by date added I end up doing this 
articles = sorted(articles, key=lambda x: x.date_added, reverse=True) 

실제로 쿼리를 실행하기 전에 전체 쿼리가 실행되므로 많은 레코드가 있으면 매우 느려질 수 있습니다. 이미 select_related()을 사용하여 최적화했습니다.

관련 모델과 order_by 날짜의 고유성을 가진 쿼리를 만드는 데 더 효율적이고 효과적인 방법이 있습니까?

UPDATE 출력은 이상적으로는 자신의 관련 문서는 고유의 검색어에 만 (즉 파이썬 정렬) 장고 ORM을 사용하여 읽기 인스턴스의 검색어 것이다.

+0

실행중인 Django의 버전은 무엇입니까? 'distinct'에 매개 변수를 전달하는 것은 1.4+ –

+0

1.4에서만 가능하며 postgres를 사용하면 작동합니다 – ender

답변

2

관련 모델과 order_by 날짜의 고유성을 가진 쿼리를 만드는 데 더 효율적이고 효과적인 방법이 있습니까?

Possibily. 전체 그림없이 말하기는 어렵지만 제 가정은 Read을 사용하여 어떤 기사가 있고 읽지 않았는지 추적하고, 특정 사용자가 기사를 읽었는지 여부를 확인하기 위해 User 인스턴스에이 정보를 연결하는 것입니다. 그렇다면 접근법에 결함이 있습니다. 당신은 다만 수 있으며, 특정 사용자의 읽기 자료를 얻기 위해, 그리고

class Article(models.Model): 
    ... 
    read_by = models.ManyToManyField(User, related_name='read_articles') 

: 대신, 당신은 뭔가를해야

때문에, 방정식에서 distinct을 사용할 필요가 소요
user_instance.read_articles.order_by('date_added') 

지금은 중복이 없습니다.

UPDATE

적어도 하나의 사용자가 읽는 모든 기사 얻으려면 : 당신은 인기에 대한 임계 값을 설정하려면,

Article.objects.filter(read_by__isnull=False) 

또는를 사용할 수있는 주석 :

from django.db.models import Count 

Article.objects.annotate(read_count=Count('read_by')).filter(read_count__gte=10) 

적어도 10 명의 사용자가 읽은 기사 만 표시됩니다.

+0

당신의 도움에 감사드립니다! 이 특정 쿼리는 실제로 여러 사용자가 읽고있는 것을 따르는 것입니다. 나는 이것을하는 다른 필터를 버렸다.이 경우 다중 사용자에 대해 집계해야하므로이 경우 Article 모델보다는 Read 모델을 쿼리하는 것이 더 효율적으로 보입니다. 말이 돼? – ender

+0

위 업데이트를 참조하십시오. –

+0

@ChrisPratt 업데이트의 첫 번째 쿼리에 오타가 있습니다. ready_by –