Foros del Web » Programando para Internet » Python »

Django: ¿como consultar modelos ManyToMany?

Estas en el tema de Django: ¿como consultar modelos ManyToMany? en el foro de Python en Foros del Web. Hola, antes que nada aclarar que tengo por fin aprender a manejar las consultas a modelos de django. Practiqué con relaciones OneToOne y ForeignKey sin ...
  #1 (permalink)  
Antiguo 29/08/2012, 21:30
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 15 años, 5 meses
Puntos: 269
Django: ¿como consultar modelos ManyToMany?

Hola, antes que nada aclarar que tengo por fin aprender a manejar las consultas a modelos de django.
Practiqué con relaciones OneToOne y ForeignKey sin problemas pero no se como trabajar los casos ManyToMany ya que no se como consultar
la tercer tabla de unión.

Al grano, tengo un listado de noticias en el cual quiero imprimir todos los tags de cada noticia. Los modelos:

Código Python:
Ver original
  1. #models.py
  2.  
  3. class Noticia(models.Model):
  4.     titulo= models.CharField(max_length=30)
  5.     tags = models.ManyToManyField(Tag)
  6.  
  7. class Tag(models.Model):
  8.     nombre = models.CharField(max_length=30)
Luego consulto los modelos en la función de vista pasando al template todas las noticias y todos los tags por separado:
Código Python:
Ver original
  1. #views.py
  2.  
  3. def inicio(request):
  4.     noticias = Noticia.objects.all()
  5.     tags = Tag.objects.all()
  6.     return render_to_response('inicio.html', {'noticias':noticias, 'tags':tags}, context_instance(request))
finalmente listo las noticias y dentro de cada una ... todos los tags
inicio.html

Código HTML:
Ver original
  1. {% for noticia in noticias%}
  2.     {{noticia.titulo}}
  3.     {% for tag in tags %}
  4.         {{tag.nombre}}
  5.     {% endfor %}
  6. {% endfor %}

Como cabe esperar se listan todos los tags y no solo los relacionados a cada noticia en particular.
Pues no se como acceder a la tercer tabla de la relación muchos a muchos 'noticia_tags: id, noticia_id, tag_id'

¿Tengo acceso a la tabla de unión o es preferible elaborar la consulta en la función de vista?
Desde ya muchas gracias
  #2 (permalink)  
Antiguo 29/08/2012, 21:40
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Django: ¿como consultar modelos ManyToMany?

Código Python:
Ver original
  1. {% for noticia in noticias%}
  2.     {{noticia.titulo}}
  3.     {% for tag in noticia.tags.all %}
  4.         {{tag.nombre}}
  5.     {% endfor %}
  6. {% endfor %}
Supongo que lo quieres hacer es algo mas o menos así.

PD: No es necesario tener tags = Tag.objects.all() en la vista para este ejemplo.
  #3 (permalink)  
Antiguo 29/08/2012, 21:53
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 15 años, 5 meses
Puntos: 269
Respuesta: Django: ¿como consultar modelos ManyToMany?

Resuelto, muchisimas gracias razpeitia, brillante, justo lo que necesitaba!
  #4 (permalink)  
Antiguo 24/09/2012, 15:38
Avatar de netcirion  
Fecha de Ingreso: agosto-2006
Ubicación: Argentina
Mensajes: 6
Antigüedad: 18 años, 2 meses
Puntos: 1
Pregunta Respuesta: Django: ¿como consultar modelos ManyToMany?

Hola, ¿que tal?

A mi no me funcionó, ni siquiera un error, nada. Simplemente no muestra los tags... y tengo exactamente lo mismo que cristian_cena... ¿Alguna sugerencia?

¡Espero puedan ayudarme!

¡¡Gracias!! :)
  #5 (permalink)  
Antiguo 24/09/2012, 16:10
Avatar de netcirion  
Fecha de Ingreso: agosto-2006
Ubicación: Argentina
Mensajes: 6
Antigüedad: 18 años, 2 meses
Puntos: 1
Respuesta: Django: ¿como consultar modelos ManyToMany?

¡Solucionado!

Un pequeño detalle:

en la línea 3 del código de razpeitia ( {% for tag in noticia.tags.all %} ) no es noticia.tags.all, es noticia.tag.all

Muchas gracias por la ayuda, sin tu respuesta, razpeitia, no iba a saber cómo buscar :)

¡Saludos!

Etiquetas: consultar, django, modelos, nombre
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:48.