2016-04-05 15 views
0

Ich habe zwei Modelle abzurufen:Wie die Anzahl der Objekte in einer ManyToMany Beziehung rückwärts

class Tag(models.Model): 
    """ This class rapresent a tag that can be applied to a product's 
     category """ 

    name = models.SlugField() 

class Product(models.Model): 
    """ This class rapresent a product """ 

    product_id = models.IntegerField() 
    image = models.ImageField(max_length=1024) 
    price = models.DecimalField(max_digits=6, decimal_places=2) 
    discount = models.DecimalField(max_digits=6, decimal_places=2) 
    brand = models.CharField(max_length=200, default='') 
    category = models.ManyToManyField(Tag) 
    gender = models.CharField(max_length=200, default='') 
    last_updated = models.DateTimeField(auto_now=False, auto_now_add=False, 
             default=timezone.now) 

Ich kann nicht herausfinden, wie die Anzahl der Produkte abzurufen, die mit jedem Tag-Objekt begrenzt sind. Ich habe versucht, etwas wie:

Tag.objects.annotate(prod_num=Count(Tag.product_set.all())).order_by('prod_num') 

aber es scheint, dass nichts richtig funktioniert. Es gibt eine nette und saubere Möglichkeit, eine Liste von tag_name, num_of_prods zu erhalten?

Antwort

3

So verwenden Sie nicht annotate. Es sollte sein:

Tag.objects.annotate(prod_num=Count('product')).order_by('prod_num') 
+0

woher 'prod_num' kommt? Im Dokument heißt es: 'num_ *' –

+1

Es ist nur ein neuer Name, mit dem Sie jedes Objekt im Abfrage-Set mit annotieren. Sie können also 'num_ *' oder '* _num' verwenden. Ich denke, im Dokument benutzen sie 'num_ *' weil es lesbar und verständlich ist. – AKS

+0

Danke Mann, du hast meinen Tag gerettet! –

Verwandte Themen