2014-05-16 2 views
4

설명을 찾을 수없는 문제가 있습니다.장고 모델과 다 대다 관계 - 가장 유사한 객체 찾기

하나의 객체 (이 경우 "Article")가 주어지면 측정 된대로 다른 기사가 기사 X와 가장 유사한 것을 결정하기 위해 다른 유형의 객체 (이 경우 "Category")를 사용하고자합니다. 공통점이있는 카테고리 수만큼 Article와 Category 사이의 관계는 many to many 다. 유스 케이스는 링크로 표시 할 관련 객체의 빠른 목록을 가져 오는 것입니다.

는 내가 손으로 SQL을 작성합니다 정확히 알고

select 
    ac.article_id 
from 
    Article_Category ac 
where 
    ac.category_id in 
    (
     select 
      category_id 
     from 
      Article_Category 
     where 
      article_id = 1 -- get all categories for article in question 
    ) 
    and ac.article_id <> 1 
group by 
    ac.article_id 
order by 
    count(ac.category_id) desc, random() limit 5 

내가 고민하고있어이 논리와 일치하는 단 하나 개의 쿼리를 실행하는 장고 모델 집계를 사용하는 방법입니다. 나는 obv. 가능한 경우 프레임 워크 내에서 수행하는 것을 선호합니다. 아무도 이것에 대한 포인터가 있습니까?

+1

django ORM 구문으로 표현하기 쉽지 않은 경우 원시 쿼리 (https://docs.djangoproject.com/en/dev/topics/db/sql/)를 실행하는 데는 아무런 문제가 없습니다. – alecxe

+0

빠른 응답을 보내 주셔서 감사합니다. 확실히 원시 쿼리를 실행할 수 있습니다. ORM 구문을 사용하여 구현하는 쉬운 방법을 놓치지 않으려 고합니다. 나는 그것으로 일하는 것에 상당히 새로운 사람이다. – dlb8685

+0

[Django annotate query set of subquery] 가능한 중복 (0120)이 (가) –

답변

2

이것을 추가하면 모델 프레임 워크에서이를 수행 할 수있는 방법을 찾았습니다.

related_article_list = Article.objects.filter(category=self.category.all())\ 
         .exclude(id=self.id) 
related_article_ids = related_article_list.values('id')\ 
         .annotate(count=models.Count('id'))\ 
         .order_by('-count','?') 

related_article_list 부분에는 2 개 이상의 카테고리와 일치하는 다른 기사 개체가 별도로 포함됩니다. 따라서 주석을 사용하여 개수를 계산할 때 번호는 1보다 커야하며 그렇게 주문할 수 있습니다.