2017-12-20 2 views
1

나는 ProductTag과 manytomany 관계를 갖고 있으며, 내 태그 세트와 가장 일치하는 제품을 찾고 싶습니다. django manytomany order_by 관계 수

class Product(models.Model): 
    def __str__(self): 
     return self.title 
    title = models.CharField(max_length=200) 
    price = models.IntegerField() 
    tags = models.ManyToManyField(Tag, related_name="products", blank=True) 

class Tag(models.Model): 
    def __str__(self): 
     return self.name 
    name = models.CharField(max_length=50) 

나는 tag s의 검색어 세트가 나는 제품이 선택된 태그의 대부분이 중로 내 제품을 주문하려면?

이렇게하는 데 깔끔한 트릭이 있습니까? 아니면 모든 제품을 쿼리 한 다음 직접 정렬해야합니까? 예를 들어

, 내가 3 개 태그와 검색어 세트가있는 경우 : STEM, Programming, K-6

나는 제품이 있습니다

Computer Science Book (Programming), 
Engineering Puzzle (K-6, STEM), 
Cookie Cutters (K-6), 
Rocket (STEM, K-6, Programming), 
Backpack (K-6) 

내가하지만,이 순서로 그 같은 항목을 반환 할를 :

Rocket (STEM, K-6, Programming), 
Engineering Puzzle (K-6, STEM), 
Computer Science Book (Programming), 
Cookie Cutters (K-6), 
Backpack (K-6) 

답변

0

'Many (많은)'관계 (ManyToMany 또는 ForeignKey)를 기준으로 쿼리 세트를 정렬하려면 다음을 수행하십시오.

from django.db.models import Count 

# assume 'selected_tags' contains tags to be filtered 
ordered_products = Product.objects.filter(tags__in=selected_tags).annotate(num_tags=Count('tags')).order_by('-num_tags') 
0

이렇게하는 방법은 없습니다. 한 가지 방법입니다. 모든 제품 가져 오기.

d = {} 
products = Product.objects.all() 
for a in products: 
    tags = a.tags.values_list('name', flat=True) 
    d[a.name] = tags 

for k in sorted(d, key=lambda k: len(d[k]), reverse=True): 
    print k , d[k]