filtrar tags do django-taggit no Queryset do Django
Tendo os seguintes modelos:
class Post(models.Model):
title = models.CharField(max_length=250)
tags = TaggableManager()
e os dados são:
**post.title** **post.tags**
Django By Example python,django,web
Who was Django Reinhardt python,django,
Test-Driven Development with Python python,web
Python for Data Analysis python,data
Learning Python python
Programming Python python
Automate the Boring Stuff with Python python
Eu tento codificar abaixo
>>> alist=Post.objects.filter(tags__name__in=["data","python"])
>>> for i in alist.annotate(sam_tags=Count('tags')):
... print("\n---",i)
... print("tags of it : ",i.tags.all())
... print("value of sam_tags : ",i.sam_tags)
...
--- Django By Example
tags of it : [<Tag: django>, <Tag: python>, <Tag: web>]
value of sam_tags : 1
--- Who was Django Reinhardt
tags of it : [<Tag: django>, <Tag: python>]
value of sam_tags : 1
--- Automate the Boring Stuff with Python
tags of it : [<Tag: python>]
value of sam_tags : 1
--- Test-Driven Development with Python
tags of it : [<Tag: python>, <Tag: web>]
value of sam_tags : 1
--- Learning Python
tags of it : [<Tag: python>]
value of sam_tags : 1
--- Python for Data Analysis
tags of it : [<Tag: data>, <Tag: python>]
value of sam_tags : 2
--- Programming Python
tags of it : [<Tag: python>]
value of sam_tags : 1
>>>
por que o valor de slist [0] .sam_tags (post: Django por exemplo) é igual a 1?
Eu acho que o objeto post de (post: Django By Example) possui três tags [python, django e web] depois de ler a documentação do Django.
https://docs.djangoproject.com/en/1.10/ref/models/querysets/#count
Disse queContagem (expressão) retorna o número de objetos que estão relacionados através da expressão fornecida. então o código
>>>alist[0].tags.all()
[<Tag: django>, <Tag: python>, <Tag: web>]
mostra que há três tags em alist [0] .tags,
>>> slist=alist.annotate(sam_tags=Count('tags'))
>>> slist[0].tags.all()
[<Tag: django>, <Tag: python>, <Tag: web>]
>>> slist[0].sam_tags
1
mas aqui eu recebo o valor 1,
porque?
Eu entendo que o Django está contando apenas as tags "python" e "data" que eu incluí na minha cláusula de filtro - outras tags não são contadas.
A saída de "slist [0] .tags.all ()" mostra que o slist [0] tem três tags relacionadas a ele mesmo. Como a documentação do django diz que Count (expressão) retorna o número de objetos relacionados pela expressão fornecida, slist [0] .sam_tags deve ser 3 de acordo com a documentação, mas django-taggit torna slist [0] .sam_tags para seja 1.
Então, o que realmente quero saber é como o django-taggit permite que Count (expression) na cláusula filter apenas calcule o número de tags na condição de filtro.