Django - ManytoManyField django-manytomanyfield


En esta ocasión vamos a ver el framework django y como usar el ManyToManyField.

Crearemos dos modelos Post y Tag.

class Tag(models.Model):
    name = models.CharField(max_length=255)

    class Meta:
        verbose_name = "Tag"
        verbose_name_plural = "Tag"

    def __str__(self):
        return self.name


class Post(models.Model):
    is_active = models.BooleanField(default=True)
    name = models.CharField(max_length=255)
    content = models.TextField()
    tags = models.ManyToManyField("Tag")
    slug = models.CharField(max_length=255)
    
    class Meta:
        verbose_name = "Post"
        verbose_name_plural = "Post"

    def __str__(self):
        return self.name

 

Agregaremos data a nuestra Tag mediante la shell que provee django.

>>> tag_frontend = Tag.objects.create(name='Frontend')
>>> tag_backend = Tag.objects.create(name='Backend')
>>> tag_devops = Tag.objects.create(name='Devops')

 

Creamos nuestro post

>>> post = Post.objects.create(name='Primera publicacion', content='Hola Mundo', slug='primera', tags=tag_frontend)

TypeError: Direct assignment to the forward side of a many-to-many set is prohibited. Use tags.set() instead.

Como vemos al momento de crear un post hay un error agregando el tag (manytomany)

 

Veremos como agrega tags(manytomany)

>>> post = Post.objects.create(is_active=True, name='Primera publicacion', content='Hola Mundo', slug='primera')
>>> post.tags.add(tag_frontend)
>>> post.tags.all()
<QuerySet [<Tag: Frontend>]>
>>> post.tags.add(tag_backend, tag_devops)
>>> post.tags.all()
<QuerySet [<Tag: Frontend>, <Tag: Backend>, <Tag: Devops>]>

 

Removeremos un tag

>>> post.tags.remove(tag_backend)
>>> post.tags.all()
<QuerySet [<Tag: Frontend>, <Tag: Devops>]>

 

Limpiaremos todos los tags ingresado

>>> post.tags.clear()
>>> post.tags.all()
<QuerySet []>

 

Ahora veremos dos formas de como agregar un listado

>>> tags = Tag.objects.all()
>>> post.tags.set(tags)
>>> post.tags.all()
<QuerySet [<Tag: Frontend>, <Tag: Backend>, <Tag: Devops>]>

>>> post.tags.clear()
>>> post.tags.add(*tags)
>>> post.tags.all()
<QuerySet [<Tag: Frontend>, <Tag: Backend>, <Tag: Devops>]>
>>> 

 

Si deseamos ver cuantos post tiene asociado nuestro tag

>>> post_second = Post.objects.create(is_active=True, name='Segunda publicacion', content='Hola Mundo', slug='segunda')
>>> post_second.tags.add(tag_frontend)
>>> tag_frontend.post_set.all()
<QuerySet [<Post: Primera publicacion>, <Post: Segunda publicacion>]>

Como vemos lo hacemos accediendo al modelo post (post_set).

 

Espero que les haya sido de su ayuda.