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.