Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] Duda con consultas ManytoMany

Estas en el tema de Duda con consultas ManytoMany en el foro de Python en Foros del Web. Hola a todos estoy aprendiendo Python y Django,para practicar estoy haciendo un website que permita a los usuarios subir canciones, clasificadas por géneros e instrumentos. ...
  #1 (permalink)  
Antiguo 25/03/2013, 07:22
 
Fecha de Ingreso: enero-2011
Mensajes: 11
Antigüedad: 13 años, 2 meses
Puntos: 0
Duda con consultas ManytoMany

Hola a todos estoy aprendiendo Python y Django,para practicar estoy haciendo un website que permita a los usuarios subir canciones, clasificadas por géneros e instrumentos. Los géneros e instrumentos se añaden desde el admin y las pistas se pueden añadir desde el front estando registrado como usuario tambien.

Hay varias cosas que se que no estoy haciendo bien, una de ellas es que no almacena con las pistas el autor, ni siquiera ha creado en la tabla un campo para ello, algo estoy haciendo mal con el model. foreignkey user. Seria de gran ayuda si alguien me da una orientacion sobre esto.

Mi otra y principal duda es que cuando entre en pistas.html deberian de salir desplegados con casillas todos los generos permitiendo pulsar en varios y realizar una busqueda de pistas en funcion de los generos seleccionados. En este momento solamente despliega todas las pistas.
No se si esto debe de hacerse con un form o como debe hacerse, pido tambien en esto un poco de ayuda.

Aqui esta mi código de la app música.

models.py**************************

Código:
from django.db import models
from django.contrib.auth.models import User
# Create your models here.

class generos(models.Model):
	nombre = models.CharField(max_length=250)
	def __unicode__(self):
		return self.nombre

class instrumentos(models.Model):
	nombre = models.CharField(max_length=250)
	def __unicode__(self):
		return self.nombre

class pista(models.Model):

	def url(self,filename):
		ruta = "Pistas/%s/%s"%(self.nombre.str(filename))
		return ruta
	nombre	= models.CharField(max_length=200)
	descripcion	= models.TextField(max_length=300)
	audio 	= models.FileField(upload_to='pistas')
	autor	= models.ForeignKey(User)
	status	= models.BooleanField(default=True)
	generos	= models.ManyToManyField(generos, related_name='pistas')
	instrumentos	= models.ManyToManyField(instrumentos, related_name='pistas')
	def __unicode__(self):
		informacionPista = "%s %s"%(self.nombre,self.audio)
		return informacionPista
views.py********************************

Código:
from django.shortcuts import render_to_response
from django.template import RequestContext
from impromusic.apps.musica.forms import subirpistaForm
from impromusic.apps.musica.models import pista
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
def subir_pista_view(request):
	info = "Inicializando"
	if request.user.is_authenticated():
		if request.method == "POST":
			form = subirpistaForm(request.POST, request.FILES)
			if form.is_valid():
				nombre = form.cleaned_data['nombre']
				descripcion = form.cleaned_data['descripcion']
				audio = request.FILES['audio']
				p = pista()
				p.nombre = nombre
				p.descripcion = descripcion
				p.audio	= audio
				p.status = True
				p.save()
				info = "Se guardo satisfactoriamente"
			else:
				info = "informacion con datos incorrectos"
		form = subirpistaForm()
		ctx = {'form':form, 'informacion':info}
		return render_to_response('musica/subirpista.html',ctx,context_instance=RequestContext(request))
	else:
		return HttpResponseRedirect('/')
pistas.html***********

Código:
{% extends 'base.html' %}
{% block title %}Lista de pistas ...{% endblock %}
{% block content %}
<h1>Pistas</h1>
<br>
{% if user.is_authenticated %}
	<a href="{% url 'vista_subir_pista' %}">Subir tu cancion</a>
{% endif %}
{% if pistas %}
	{% for p in pistas %}
		<p><a href="/pista/{{p.id}}/">{{p.nombre}}</a></p>
	{% endfor %}
{% else %}
	<h2>No hay pistas activas</h2>
{% endif %}
{% endblock %}
  #2 (permalink)  
Antiguo 27/03/2013, 08:34
 
Fecha de Ingreso: enero-2011
Mensajes: 11
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Duda con consultas ManytoMany

Bueno tras haber indagado mas creo que voy por el buen camino, he realizado un formulario de busqueda
Código:
class buscarForm(forms.Form):
	generos	= forms.ModelMultipleChoiceField(queryset=generos.objects.all(),widget=forms.CheckboxSelectMultiple(),required=True)
	def clean(self):
		return self.cleaned_data
una vista
Código:
def buscar_view(request):
	info ="Selecciona los generos"
	pis = pista.objects.filter(status=True)
	if request.method == "POST":
		form = buscarForm(request.POST)
		if form.is_valid():
			generos = form.cleaned_data['generos']
			pis = pista.objects.filter(generos=generos)
			info = "Estos son los resultados"
		else:
			info = "Datos incorrectos"
	else:
		form = buscarForm()
	ctx = {'form':form, 'pista':pis, 'informacion':info}
	return render_to_response('musica/buscar.html',ctx,context_instance=RequestContext(request))
el template
Código:
{% extends 'base.html' %}
{% block title %}Agregar Pista{% endblock %}
{% block content %}
<h2>Buscar pista...</h2>
	<form action="." method="POST">
		{% csrf_token %}
		{{ form.as_p }}
		<input type="submit" value="Buscar">
		<input type="reset" value="Limpiar">
	</form>
<br>
 	{{ informacion }}
	{% if pista %}
		{% for p in pista %}
			<p><a href="/pista/{{p.id}}/">{{p.nombre}}</a></p>
		{% endfor %}
	{% else %}
		<h2>No hay pistas activas</h2>
	{% endif %}
{% endblock %}
y la url
Código:
	url(r'^musica/$','buscar_view',name= "vista_buscar"),
de esta forma permite seleccionar un genero y mediante pis = pista.objects.filter(generos=generos), obtiene de la tabla pista_genero la relacion many to many y los extiende en el template con un enlace.

Lo que aun no he conseguido es que se pueda marcar mas de una casillaaa, al hacerlo obtengo el siguiente error, por favor necesitaria un poco de ayuda en esto, he visto millones de tutoriales, foros, y de todo no vengo aqui a que me hagan el trabajoa pero por favor una manita, es mi octavo mensaje en el foro que cae en el olvido sin respuesta. Gracias


Código:
DatabaseError at /musica/

(1242, 'Subquery returns more than 1 row')

Request Method: 	POST
Request URL: 	http://127.0.0.1:8000/musica/
Django Version: 	1.5
Exception Type: 	DatabaseError
Exception Value: 	

(1242, 'Subquery returns more than 1 row')

Exception Location: 	C:\Python27\lib\site-packages\MySQLdb\connections.py in defaulterrorhandler, line 36
Python Executable: 	C:\Python27\python.exe
Python Version: 	2.7.3
Python Path: 	

['C:\\Users\\ujake\\impromusic\\impromusic',
 'C:\\Python27\\lib\\site-packages\\distribute-0.6.35-py2.7.egg',
 'C:\\Python27\\lib\\site-packages\\django_audiotracks-0.2.1-py2.7.egg',
 'C:\\Python27\\lib\\site-packages\\mutagen-1.20-py2.7.egg',
 'C:\\Python27\\lib\\site-packages\\django_registration_email-0.5-py2.7.egg',
 'C:\\Python27\\lib\\site-packages\\timeside-0.4.3-py2.7.egg',
 'C:\\Windows\\system32\\python27.zip',
 'C:\\Python27\\DLLs',
 'C:\\Python27\\lib',
 'C:\\Python27\\lib\\plat-win',
 'C:\\Python27\\lib\\lib-tk',
 'C:\\Python27',
 'C:\\Python27\\lib\\site-packages',
 'C:\\Python27\\lib\\site-packages\\PIL',
 'C:\\Python27\\lib\\site-packages\\setuptools-0.6c11-py2.7.egg-info']

Server time: 	Wed, 27 Mar 2013 15:28:15 +0100
Error during template rendering

In template C:\Users\ujake\impromusic\impromusic\impromusic\templates\musica\buscar.html, error at line 13
1242
3 	{% block content %}
4 	<h2>Buscar pista...</h2>
5 	<form action="." method="POST">
6 	{% csrf_token %}
7 	{{ form.as_p }}
8 	<input type="submit" value="Buscar">
9 	<input type="reset" value="Limpiar">
10 	</form>
11 	<br>
12 	{{ informacion }}
13 	{% if pista %}
14 	{% for p in pista %}
15 	<p><a href="/pista/{{p.id}}/">{{p.nombre}}</a></p>
16 	{% endfor %}
17 	{% else %}
18 	<h2>No hay pistas activas</h2>
19 	{% endif %}
20 	{% endblock %}
Traceback Switch to copy-and-paste view

    C:\Python27\lib\site-packages\django\core\handlers\base.py in get_response

                                response = callback(request, *callback_args, **callback_kwargs)

        ...
    ▶ Local vars
    C:\Users\ujake\impromusic\impromusic\impromusic\apps\musica\views.py in buscar_view

        	return render_to_response('musica/buscar.html',ctx,context_instance=RequestContext(request))

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\shortcuts\__init__.py in render_to_response

            return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\template\loader.py in render_to_string

                return t.render(context_instance)

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\template\base.py in render

                    return self._render(context)

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\template\base.py in _render

                return self.nodelist.render(context)

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\template\base.py in render

                        bit = self.render_node(node, context)

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\template\debug.py in render_node

                    return node.render(context)

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\template\loader_tags.py in render

                return compiled_parent._render(context)

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\template\base.py in _render

                return self.nodelist.render(context)

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\template\base.py in render

                        bit = self.render_node(node, context)

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\template\debug.py in render_node

                    return node.render(context)

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\template\loader_tags.py in render

                    result = block.nodelist.render(context)

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\template\base.py in render

                        bit = self.render_node(node, context)

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\template\debug.py in render_node

                    return node.render(context)

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\template\defaulttags.py in render

                    if match:

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\db\models\query.py in __nonzero__

                return type(self).__bool__(self)

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\db\models\query.py in __bool__

                    next(iter(self))

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\db\models\query.py in _result_iter

                        self._fill_cache()

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\db\models\query.py in _fill_cache

                            self._result_cache.append(next(self._iter))

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\db\models\query.py in _safe_iterator

                    for item in iterator:

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\db\models\query.py in iterator

                for row in compiler.results_iter():

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\db\models\sql\compiler.py in results_iter

                for rows in self.execute_sql(MULTI):

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\db\models\sql\compiler.py in execute_sql

                cursor.execute(sql, params)

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\db\backends\util.py in execute

                    return self.cursor.execute(sql, params)

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\db\backends\mysql\base.py in execute

                    six.reraise(utils.DatabaseError, utils.DatabaseError(*tuple(e.args)), sys.exc_info()[2])

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\django\db\backends\mysql\base.py in execute

                    return self.cursor.execute(query, args)

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\MySQLdb\cursors.py in execute

                    self.errorhandler(self, exc, value)

        ...
    ▶ Local vars
    C:\Python27\lib\site-packages\MySQLdb\connections.py in defaulterrorhandler

            raise errorclass, errorvalue

        ...
    ▶ Local vars
  #3 (permalink)  
Antiguo 27/03/2013, 09:40
 
Fecha de Ingreso: enero-2011
Mensajes: 11
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Duda con consultas ManytoMany

Vale por fin he encontrado la respuesta, como dentro de generos podian pasar mas de una opcion la siguiente linea ke era asi:
pis = pista.objects.filter(generos=generos)
debia ser asi:
pis = pista.objects.filter(generos__in=generos)

De algun modo el __in permite pasar mas de una opcion al realizar estas consultas.

De nada por compartir mi gran sabiduria con vosotros. Adios

Etiquetas: django, lista, mac
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 16:32.