подсчитывать значения из manytomanyfield

Я пытаюсь подсчитать различные значения из группы объектов, которые имеют поле manytomany.

e.g.

объектная статья имеет много-многополей объектов-тегов


одна статья имеет теги "tag1" "tag2"

другая статья имеет теги "tag2" "tag3"


Я хотел бы выяснить что-то, что вернет что-то по строкам:

"тег1": 1 "тег2": 2 "тег3": 1

Я думал, что могу что-то сделать с article.objects.all().values('tags') или чем-то еще, но я оказался пустым.


person DantheMan    schedule 25.12.2010    source источник
comment
Я нашел способ, выполнив Tag.objects.filter(article__in=articles).values('name').annotate(count=Count(pk)) но это кажется очень вычислительно интенсивным.   -  person DantheMan    schedule 25.12.2010


Ответы (2)


модели.py

class Topping(models.Model):
        name = models.CharField(max_length = 20)

class Pizza(models.Model):
        name = models.CharField(max_length = 20)
        toppings = models.ManyToManyField(Topping)

оболочка python manage.py

>>> from many_to_many.models import Pizza, Topping
>>> t1 = Topping(name = "T1")
>>> t2 = Topping(name = "T2")
>>> t3 = Topping(name = "T3")
>>> t4 = Topping(name = "T4")
>>> p1 = Pizza(name="P1")
>>> p2 = Pizza(name="P2")


>>> p1.toppings.add(t1)
>>> p1.toppings.add(t2)
>>> p2.toppings.add(t2)
>>> p2.toppings.add(t3)


>>> t2.pizza_set.count() 
    2
>>> t1.pizza_set.count() 
    1
person Mayuresh    schedule 27.12.2010

Ваш вопрос связан с: Как подсчитывать и отображать объекты в отношении ManyToMany в Django

модели.py

class Topping(models.Model):
        name = models.CharField(max_length = 20)

class Pizza(models.Model):
        name = models.CharField(max_length = 20)
        toppings = models.ManyToManyField(Topping)

оболочка python manage.py

>>> for topping in Topping.objects.all():
...     print topping.name, topping.pizza_set.count()
person Pedro Vagner    schedule 29.08.2013