Foros del Web » Programando para Internet » Python »

Como encadeno una búsqueda en dos bases de datos?

Estas en el tema de Como encadeno una búsqueda en dos bases de datos? en el foro de Python en Foros del Web. Estas dos bases de datos están ligadas por un custom_id como se ve a continuación: Modelo: Código: from django.db import models class OtroModelo(models.Model): custom_id = ...
  #1 (permalink)  
Antiguo 14/06/2012, 14:05
Avatar de diegoug  
Fecha de Ingreso: mayo-2011
Ubicación: Colombia
Mensajes: 52
Antigüedad: 13 años, 5 meses
Puntos: 1
Pregunta Como encadeno una búsqueda en dos bases de datos?

Estas dos bases de datos están ligadas por un custom_id como se ve a continuación:

Modelo:
Código:
from django.db import models

class OtroModelo(models.Model):
    custom_id = models.IntegerField(max_length=10)
    dato = models.CharField(max_length=100)

class Modelo1(models.Model):
    custom_id = models.IntegerField(max_length=10)

class Modelo2(models.Model):
    relacion2 = models.OneToOneField(Modelo1)

class UserProfile(models.Model):
    user = models.ForeignKey(User,unique=True)
    relacion1 = models.ManyToManyField(Modelo2)

Esto me muestra todas custom_id del Modelo1 en relación a su Usuario:

Código:
custom = Modelo1.objects.filter(modelo2__userprofile__user__username=usuario)
La pregunta es como saco todos los dato relacionados a ese custom_id en OtroModelo?

Logro mostrarlos en la terminal usando un for:

Código:
for elemento in custom:
    datos = OtroModelo.objects.filter(custom_id=elemento.custom_id)
Pero este solo me guarda al ultimo ciclo del for en datos.

Como hago para guardar cada dato en la variable datos, pasarlo a la plantilla, graficarlo de manera similar a los QuerySets:
Código:
{{datos.custom_id}}
y mostrar todos los custom_id que tiene relacionado el usuario en OtroModelo?

Gracias.
__________________
_________________________
Diego Alonso Uribe Gamez
Twitter: @DiegoUG

Última edición por diegoug; 14/06/2012 a las 14:06 Razón: error de ortografía.
  #2 (permalink)  
Antiguo 15/06/2012, 10:57
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: Como encadeno una búsqueda en dos bases de datos?

No se por donde empezar, esta pregunta esta tan mal redactada que es casi imposible entenderla (ya no digo responder).

1.- Esos son modelos, que a su vez se convierten una o mas tablas y que residen en una base de datos. (Por lo menos así como los muestras)

2.- El nombre de los modelos, espero sinceramente que no sean esos, no son descriptivos.

3.- Lo que quieres hacer es un join y lo podrías hacer fácilmente si tus tablas estuvieran bien relacionadas.

4.- En resumidas cuentas quieres llegar de OtroModelo a Modelo1, pero OtroModelo, no esta relacionado con nadie.

5.- Puedes utilizar __in para no tener que hacer el for.

6.- Se ve que no dominas bien python (o cualquier otro lenguaje). Por que veo que cometes un error muy pero muy básico. Claro que datos te va solamente el ultimo resultado, si quieres todos los resultados tienes que almacenarlos en una lista o en alguna otra estructura de datos.

7.- También el nombre de las variables son pésimas, data o dato(s) son los peores nombre de variables por que no dicen que datos son.

8.- Hay campos en el query que no están en los modelos, lo que me deja mas intrigado de lo que ya estaba. Por ejemplo no tiene sentido Modelo2 a menos que tenga otros campos.

9.- ¿Sabes la diferencia entre ForeignKey + UniqueIndex y la relación OneToOne?

10.- Te recomiendo estructurar bien tu pregunta pero mas importante estructurar mejor tus modelos.
  #3 (permalink)  
Antiguo 15/06/2012, 13:25
Avatar de diegoug  
Fecha de Ingreso: mayo-2011
Ubicación: Colombia
Mensajes: 52
Antigüedad: 13 años, 5 meses
Puntos: 1
Pregunta Respuesta: Como encadeno una búsqueda en dos bases de datos?

Bueno para responder las preguntas dejo claro que este un ejemplo minimalista de lo que es el codigo completo que si lo coloco todo es mucho y solo podria colocar partes, es por eso que hice fue un ejemplo de lo que es:

1. No: son 4 modelos.

2. no son los nombres como ya lo aclare

3. UserProfile tiene muchas relaciones a Modelo2, este tiene una relacion unica a el Modelo1 que tiene un solo custom_id y OtroModelo es algo mas complicado: tiene muchos custom_id diferentes con dato diferentes, pero un custom_id se puede repetir en la lista, no estan ordenado y pueden llegar de un momento a otro.

Es por eso que consigo todo los custom_id del Modelo1 de cada usuario usando este codigo:
Código:
custom = Modelo1.objects.filter(modelo2__userprofile__user__username=usuario)
para luego buscar esos custom_id en OtroModelo y pasarlos todos a la plantilla.

Intente usando:
Código:
for elemento in custom:
    dato = OtroModelo.objects.filter(custom_id=elemento.custom_id).order_by("-id")[0]
    cadena = [0]
    cadena.append(datos)
pero como dije antes, solo me guarda un dato, no todos lo que me muestra en la terminal python.

Nota: le agregue (.order_by("-id")[0]) para que solo mostrara el ultimo dato ingresado a OtroModelo de ese custom_id.

4. No entiendo

5. No entiendo

6. eso esta intentando pero el for solo guardo un dato en la lista que cree "datos" no me guarda todos.

7. es por el ejemplo nada mas

8. es ejemplo

9. si y este es un caso especial de una relación basada en la lógica de no relacionarlos.

10. la pregunta esta bien como ejemplo, mis modelos son diferentes.

No se si me hice entender, el problema es algo que me deja un poco perplejo, como lo harías tu? para hacer que estas dos tablas se relacionen basado en un custom_id que genera el sistema, un ejemplo seria 12976743213, este custom_id u otros se le asigna a un usuario y se busca en OtroModelo todas las entradas relacionadas a este custom_id.

Gracias.

Cita:
Iniciado por razpeitia Ver Mensaje
No se por donde empezar, esta pregunta esta tan mal redactada que es casi imposible entenderla (ya no digo responder).

1.- Esos son modelos, que a su vez se convierten una o mas tablas y que residen en una base de datos. (Por lo menos así como los muestras)

2.- El nombre de los modelos, espero sinceramente que no sean esos, no son descriptivos.

3.- Lo que quieres hacer es un join y lo podrías hacer fácilmente si tus tablas estuvieran bien relacionadas.

4.- En resumidas cuentas quieres llegar de OtroModelo a Modelo1, pero OtroModelo, no esta relacionado con nadie.

5.- Puedes utilizar __in para no tener que hacer el for.

6.- Se ve que no dominas bien python (o cualquier otro lenguaje). Por que veo que cometes un error muy pero muy básico. Claro que datos te va solamente el ultimo resultado, si quieres todos los resultados tienes que almacenarlos en una lista o en alguna otra estructura de datos.

7.- También el nombre de las variables son pésimas, data o dato(s) son los peores nombre de variables por que no dicen que datos son.

8.- Hay campos en el query que no están en los modelos, lo que me deja mas intrigado de lo que ya estaba. Por ejemplo no tiene sentido Modelo2 a menos que tenga otros campos.

9.- ¿Sabes la diferencia entre ForeignKey + UniqueIndex y la relación OneToOne?

10.- Te recomiendo estructurar bien tu pregunta pero mas importante estructurar mejor tus modelos.
__________________
_________________________
Diego Alonso Uribe Gamez
Twitter: @DiegoUG

Última edición por diegoug; 15/06/2012 a las 13:41 Razón: code
  #4 (permalink)  
Antiguo 15/06/2012, 16:59
Avatar de diegoug  
Fecha de Ingreso: mayo-2011
Ubicación: Colombia
Mensajes: 52
Antigüedad: 13 años, 5 meses
Puntos: 1
Información Respuesta: Como encadeno una búsqueda en dos bases de datos?

Código:
usuario = 'reddragon' 

custom = Modelo1.objects.filter(modelo2__userprofile__user__username=usuario)

custom

[<custom: 45290>, <custom: 87345>]

datos = OtroModelo.objects.filter(custom_id__in=custom)

datos

[]
Como busco entre todos los custom_id y filtrar los que tienen custom en OtroModelo como querysets?
__________________
_________________________
Diego Alonso Uribe Gamez
Twitter: @DiegoUG
  #5 (permalink)  
Antiguo 15/06/2012, 17:44
Avatar de diegoug  
Fecha de Ingreso: mayo-2011
Ubicación: Colombia
Mensajes: 52
Antigüedad: 13 años, 5 meses
Puntos: 1
Exclamación Respuesta: Como encadeno una búsqueda en dos bases de datos?

Código:
datos = OtroModelo.objects.filter(custom_id=custom)

datos

DatabaseError: (1242, 'Subquery returns more than 1 row')
__________________
_________________________
Diego Alonso Uribe Gamez
Twitter: @DiegoUG
  #6 (permalink)  
Antiguo 18/06/2012, 15:16
Avatar de diegoug  
Fecha de Ingreso: mayo-2011
Ubicación: Colombia
Mensajes: 52
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Como encadeno una búsqueda en dos bases de datos?

Saludos:

Estaba leyendo y nada que logro resolver este dilema

Me preguntaba si se puede extender el queryset con múltiples filtros (para el ejemplo seria los dos custom_id) como filtrar todos los resultados usando custom y posteriormente poder sacar individualmente los datos para cada custom_id desde la plantilla?

También pensé en hacer una variable queryset para cada custom id y mandarla a la plantilla, el problema es que no se como hacer para mandar muchas y graficarlas desde el template, pueden ser 10 custom_id como ejemplo y con un for graficarlas:

Código:
{% for elemento in custom %}
    {{id_{{elemento.custom_id}}}}
{% endfor %}
Pero no se si se puede hacer esto {{id_{{elemento.custom_id}}}} ?? y como funcionaria si funciona?

Igual estoy pensando de todo para hacer esto y les agradecería una ayuda.
__________________
_________________________
Diego Alonso Uribe Gamez
Twitter: @DiegoUG
  #7 (permalink)  
Antiguo 20/06/2012, 10:42
Avatar de diegoug  
Fecha de Ingreso: mayo-2011
Ubicación: Colombia
Mensajes: 52
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Como encadeno una búsqueda en dos bases de datos?

Ya mire y no se puede hacer eso en el sistema de plantillas.
__________________
_________________________
Diego Alonso Uribe Gamez
Twitter: @DiegoUG

Última edición por diegoug; 20/06/2012 a las 10:48 Razón: quiero borrarlo
  #8 (permalink)  
Antiguo 21/06/2012, 10:31
Avatar de diegoug  
Fecha de Ingreso: mayo-2011
Ubicación: Colombia
Mensajes: 52
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Como encadeno una búsqueda en dos bases de datos?

Ya lo resolví, gracias a Alexis Roda

Cargas otra variable a la plantilla que contenga esa variable, tiene que hacer un bucle y contener mi query personalizado:

from itertools import *
for elemento in datos:
# operación
quey = chain(query,[resultado])

query funciona de la misma manera que los queryset en los template.
__________________
_________________________
Diego Alonso Uribe Gamez
Twitter: @DiegoUG

Etiquetas: django, django1.4, djangomodels, djangotemplate
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:10.