2017-12-20 15 views
1

私はProductTagと数多くの関係を持っており、自分のタグのセットと一致する商品を見つけたいと思っています。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秒のクエリセットを持っていると私はどちらかの製品で、私の製品を注文したい選択したタグのほとんどを持っていますか?

これを行うためのすてきなトリックはありますか?あるいは、私はすべての製品を照会してから自分でソートする必要がありますか?例えば

、私は3個のタグでクエリセットを持っている場合: STEMProgrammingK-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] 
関連する問題