Confusión en modelos Django - ForeignKey

1,086 views
Skip to first unread message

Diego Alonso Uribe Gamez

unread,
Apr 19, 2012, 11:11:26 AM4/19/12
to Django-es
Mi duda es en como relacionar las bases de datos de uno a muchos,
apuntando a un solo campo.

Quiero relacionar un modelo a otro en un campo especifico que se
mantiene igual pero se repite muchas veces en un periodo de tiempo
determinado, como las idas al medico, no se como hacerlo!! creo que se
hace con ForeignKey pero la verdad no entiendo como es que funciona o
cual es la lógica?

La clase "Cedula" funciona como filtro para consultar todos los
estados de la persona en diferentes áreas y en otros modelos, lo que
quiero es poder relacionar la Cedula usando el campo "examen_basico" y
este relacionarlo únicamente con el campo "cedula" de la Clase "Salud"
para que cada ves que la persona se haga un examen básico se llena una
nueva entrada donde el único campo que no cambia es la cédula, la idea
es poder organizar mas tarde en las vistas la información otorgada en
un listado organizado por fechas usando la cédula como corredor.

---------------------------------------------------------------------------------
class Salud(models.Model):
cedula = models.BigIntegerField(max_length=10)
presion_sanguinea = models.IntegerField(max_length=5)
peso = models.IntegerField(max_length=5)
fecha = models.BigIntegerField(max_length=14)

def __unicode__(self):
return '%s %s %s %s %s %s' % (self.id_cedula,
self.presion_sanguinea, self.peso,self.fecha)

class Cedula(models.Model):unico
id_cedula = models.BigIntegerField(max_length=10)
nombres = models.CharField(max_length=40)
apellidos = models.CharField(max_length=40)
examen_basico = ???????????

def __unicode__(self):
return '%s %s %s' %
(self.id_cedula,self.nombre,self.apellidos,self.examen_basico)
---------------------------------------------------------------------------------

Ejemplo: Clase Salud
Cedula: 1014101237 Presion saguinea: 120 Peso: 91 Fecha: 2008
Cedula: 19315696 Presion saguinea: 110 Peso: 110 Fecha: 2008
Cedula: 1014101237 Presion saguinea: 125 Peso: 94 Fecha: 2009
Cedula: 19315696 Presion saguinea: 120 Peso: 95 Fecha: 2009
Cedula: 1014101237 Presion saguinea: 130 Peso: 96 Fecha: 2010
Cedula: 19315696 Presion saguinea: 140 Peso: 89 Fecha: 2010
Cedula: 1014101237 Presion saguinea: 110 Peso: 89 Fecha: 2011
Cedula: 19315696 Presion saguinea: 150 Peso: 85 Fecha: 2011

Ejemplo: Clase Cedula
id_cedula: 1014181236 nombres: diego apellidos: alonso
examen_basico:???
id_cedula: 19315696 nombres: daniel apellidos: uribe examen_basico:???

la idea es buscar por el numero de "id_cedula" "1014101237" los datos
de la clase "Salud" desde la clase "Cedula" guardándolo en una lista
desde la vista, como se cuadra el modelo para hacer esto? o es que
estoy pensándolo mal?

Yo quería buscar desde la vista usando la clase "Cedula" y el campo
"examen_basico" todos los datos en salud:
examenes = Cedula.objects.get(examen_basico__exact=1014181236)

La cuestión es que a la Clase "Cedula" se le insertan los datos usando
un código en Python y si le agrego una clase foranea también el código
en Python tendría que ingresar ese dato foraneo, todo seria automático
basado en mi plataforma.

La verdad es que me ha tocado aprender a programar, en python y django
solo, no soy ing de nada pero bueno algo se aprende y se hace en
Internet gracias a la ayuda de todos ustedes.

Carlos Luis Jordán Murillo

unread,
Apr 19, 2012, 12:18:17 PM4/19/12
to djan...@googlegroups.com
Hola Diego, te recomiendo que visites mi blog, ahí hay ejemplos de foreignkeys http://tuneandolaweb.blogspot.com/ si aún te quedan dudas ahí puedes hacerlas y las contestaré con gusto


--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
 Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
 Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
 Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.



--
Saludos
Carlos Jordán
Ingeniero  
Escuela Superior Politécnica del Litoral
Ciencias Computacionales especialización Sistemas de Información

Diego Uribe Gamez

unread,
Apr 19, 2012, 12:36:19 PM4/19/12
to djan...@googlegroups.com
Mira Carlos que no encontré lo que me dijiste, solo encontre este articulo:

Tipos de datos que puede contener los modelos en django


El problema es que sigo con la duda de como cuadrar el modelo para que funcione como quiero, si me explique claramente en la pregunta principal o que camino me recomiendas tomar para cuadrar  el modelo?

Gracias.
 Diego Alonso Uribe Gamez

Desarrollador web

Twitter: @DiegoUG

Google+: http://gplus.to/diegoug




Carlos Luis Jordán Murillo

unread,
Apr 19, 2012, 12:39:33 PM4/19/12
to djan...@googlegroups.com

Diego Uribe Gamez

unread,
Apr 19, 2012, 12:49:16 PM4/19/12
to djan...@googlegroups.com
Carlos, ya lo mire y lo que me muestras en la 1ra perte como la 2da parte ya lo se, el proyecto aunque es pequeño no lo es tanto, ya tengo los modelos, parte de las vistas, el template, las librerias css, js y demás cosas funcionando. Solo me queda relacionar bien la base de datos para las consultas internas desde la vista.

Me tomo tiempo aprender muchas cosas, como también me toco leer los libros de Django en español que esta en una versión vieja por cierto y el libro de python para todos.

La verdad solo estoy atorado en esta parte, mas adelante me tocara continuar con el tema de registro de usuarios para que vean únicamente la información que le pertenece y pa delante.

Gracias por el dato del Blog, aunque si puedes me gustaría me ayudaras por este canal :)

Un saludo Carlos y gracias, espero me puedas ayudar.

Carlos Luis Jordán Murillo

unread,
Apr 19, 2012, 12:55:54 PM4/19/12
to djan...@googlegroups.com
En qué versión estás trabajando django?

Carlos Luis Jordán Murillo

unread,
Apr 19, 2012, 12:57:53 PM4/19/12
to djan...@googlegroups.com
from django.core import meta

class Place(meta.Model):
    name = meta.CharField(maxlength=50)
    address = meta.CharField(maxlength=80)

    def __repr__(self):
        return "%s the place" % self.name

class Restaurant(meta.Model):
    place = meta.OneToOneField(Place)
    serves_hot_dogs = meta.BooleanField()
    serves_pizza = meta.BooleanField()

    def __repr__(self):
        return "%s the restaurant" % self.get_place().name

class Waiter(meta.Model):
    restaurant = meta.ForeignKey(Restaurant)
    name = meta.CharField(maxlength=50)

    def __repr__(self):
        return "%s the waiter at %r" % (self.name, self.get_restaurant())

Diego Uribe Gamez

unread,
Apr 19, 2012, 12:57:20 PM4/19/12
to djan...@googlegroups.com
last 1.4

Carlos Luis Jordán Murillo

unread,
Apr 19, 2012, 12:58:13 PM4/19/12
to djan...@googlegroups.com
ahí tu puedes ver relaciones de uno a uno

Diego Uribe Gamez

unread,
Apr 19, 2012, 1:02:26 PM4/19/12
to djan...@googlegroups.com
En mi modelo tengo relaciones uno a uno, no en este si no que en el proyecto completo, el problema que tengo es que no es uno a uno, si no que es uno a muchos, y lo único que los relaciona es la cédula. Pero si te das cuenta en la clase Salud hay entradas de dos cédulas y la idea es que la clase cédula en la vista me de solo los datos de una sola cédula.

Carlos Luis Jordán Murillo

unread,
Apr 19, 2012, 1:11:20 PM4/19/12
to djan...@googlegroups.com
diego de donde a donde quieres ir de salud a cedula o de cedula a salud???

Carlos Luis Jordán Murillo

unread,
Apr 19, 2012, 1:13:22 PM4/19/12
to djan...@googlegroups.com
Debería quedar así



class Cedula(models.Model):
    id                      = models.AutoField(primary_key=True)
    cedula_id               = models.BigIntegerField(max_length=10, unique = True)

    nombres                 = models.CharField(max_length=40)
    apellidos               = models.CharField(max_length=40)
 
    def __unicode__(self):
        return '%s %s %s'(self.id_cedula,self.nombre,self.apellidos)
       
       
class Salud(models.Model):
   
    id                      = models.AutoField(primary_key=True)
    cedula                  = models.ForeignKey(Cedula)

    presion_sanguinea       = models.IntegerField(max_length=5)
    peso                    = models.IntegerField(max_length=5)
    fecha                   = models.DateTimeField()


    def __unicode__(self):
        return '%s %s %s %s %s %s' % (self.id_cedula,
               self.presion_sanguinea, self.peso,self.fecha)


Diego Uribe Gamez

unread,
Apr 19, 2012, 1:40:20 PM4/19/12
to djan...@googlegroups.com
Ultima pregunta, para entender mejor:

Que es? o cual es la lógica de: ForeignKey y ManyToManyField

Me podrías explicar que significan y como puedo usarlos, algún caso por ejemplo.

Gracias Carlos.

Carlos Luis Jordán Murillo

unread,
Apr 19, 2012, 1:47:58 PM4/19/12
to djan...@googlegroups.com
many to many es un tipo de relación en este caso es de muchos a muchos, la foreignkey es de uno a muchos ¿Te salió?

Diego Uribe Gamez

unread,
Apr 19, 2012, 1:51:34 PM4/19/12
to djan...@googlegroups.com
Voy a probar mas tarde, estoy trabajando en algo diferente, ya te comento Carlos.

Un saludo y Gracias :)

Carlos Luis Jordán Murillo

unread,
Apr 19, 2012, 2:37:41 PM4/19/12
to djan...@googlegroups.com
listo éxitos

Alberto Chamorro

unread,
Apr 19, 2012, 2:55:39 PM4/19/12
to djan...@googlegroups.com

La relacion uno a muchos es cuando un objeto puede relacionarse con varios pero esos varios solo pertenecen a uno. Por ejemplo una persona puede comprar muchas pizzas pero una pizza de las que compre solo le pertenece a el.

Relacion muchos a muchos es cuando los objetos se relacionan dr manera multiple en ambas direcciones. Por ejemplo 1 piloto de F1 puede correr en muchos circuitos y en un circuito pueden correr muchos pilotos! En la relacion de estos dos podrias guardar el resultado de cada piloto en cada circuito! Esto ejemplo puedes verlo en mi github! Jajaja

Enviado desde mi Galaxy Nexus @ach4m0

Diego Uribe Gamez

unread,
Apr 23, 2012, 3:58:33 PM4/23/12
to djan...@googlegroups.com
Ya mirando un poco el manual de Django avance pero no logro recorrer las tablas vinculadas? a continuación les mostrare el modelo nuevo:

---------------------------------------------------------------------------------------------
class Usuario(models.Model):
    id = models.BigIntegerField(primary_key=True,max_length=14)

    nombres                 = models.CharField(max_length=40)
    apellidos               = models.CharField(max_length=40)
 
    def __unicode__(self):
        return '%s %s %s'(self.id,self.nombre,self.apellidos)
        
    
class Cedula(models.Model):
    id_cedula = models.ForeignKey(Usuario)

    def __unicode__(self):
        return '%s' % (self.id_cedula)

---------------------------------------------------------------------------------------------
Nota: recordar que se crea de forma automática un PRIMARY como id en Cedula.

Tengo dos problemas y es que 1ro el modelo creo las tablas algo diferentes a lo que me aparecieron los modelos, la principal duda es que creo id_cedula_id donde _id al final no se porque entro y tambien paso con clinica_salud_1b40a79a en _1b40a79a?

---------------------------------------------------------------------------------------------

Field Type Collation Attributes Null Default Extra Action
id int(11) No None AUTO_INCREMENT
id_cedula_id bigint(20) No None  Check All / Uncheck All With selected:        
Print view  Relation view  Propose table structure  Track table 
 Add  field(s) At End of Table  At Beginning of Table  After  
Indexes: 

Action Keyname Type Unique Packed Field Cardinality Collation Null Comment
PRIMARY BTREE Yes No id 1 A
clinica_cedula_1b40a79a BTREE No No id_decula_id 0 A

---------------------------------------------------------------------------------------------

Como dije antes la idea es recorrer el modelo que contiene los datos del Usuario desde el modelo que contiende los datos de la Cedula (Cedula ----> Usuario) en la vista que mas o menos seria así:


esto me devuelve los nombres y apellidos en la vista
---------------------------------------------------------------------------------------------
datos_del_usuario = Cedula.objects.order_by("-id")[0]

o

datos_del_usuario = Cedula.id_cedula.objects.order_by("-id")[0]

o

datos_del_usuario = Cedula.id_cedula.objects.order_by("-id")[0]

o

datos_del_usuario = Cedula.objects.get(id_cedula__exact=1014181234)

o

datos_del_usuario = Cedula.id_cedula.objects.get(id_cedula__exact=1014181234)

---------------------------------------------------------------------------------------------

La idea es ligar el numero de cédula en ambas partes, donde el id (creado por defecto en django) en Cedula este junto a una ForeignKey(Usuario) que contiene el numero de cédula y se vincule al modelo Usuario usando: "id = models.BigIntegerField(primary_key=True,max_length=14)" que es el numero de cédula.

El dato esta bien almacenado desde python (MYSQL):

Usuario
id nombres apellidos
1014181234 Diego Uribe

Cedula
id id_cedula_id
1 1014181234

Schcriher

unread,
Apr 24, 2012, 12:02:54 PM4/24/12
to djan...@googlegroups.com
Hola Diego, retoque un poquito tus modelos:


from django.db import models

class Usuarios(models.Model):
    id          = models.BigIntegerField(primary_key=True, max_length=14)
    nombres     = models.CharField(max_length=40)
    apellidos   = models.CharField(max_length=40)
    def __unicode__(self):
        return '%s %s %s' % (self.id, self.nombres, self.apellidos)

class Cedulas(models.Model):
    usuario             = models.ForeignKey(Usuarios, related_name='cedula')
    presion_sanguinea   = models.IntegerField(max_length=5)
    peso                = models.IntegerField(max_length=5)
    def __unicode__(self):
        return '%s' % (self.usuario.id)


Por consola podrías hacer esto para probar, creamos algunos datos:


In [1]: u1 = Usuarios.objects.create(id=1014181234, nombres='Diego', apellidos='Uribe')
In [2]: c1 = Cedulas.objects.create(usuario=u1, presion_sanguinea=120, peso=91)
In [3]: c2 = Cedulas.objects.create(usuario=u1, presion_sanguinea=100, peso=90)


Y asi podríamos obtenerlos (cuando sea necesario), buscando en las cédulas los usuarios con nombres = 'diego' (sin tener en cuanta las mayúsculas)

In [6]: Cedulas.objects.filter(usuario__nombres__iexact='diego')
Out[6]: [<Cedulas: 1014181234>, <Cedulas: 1014181234>]


Y así obtener el usuario de id = 1014181234 y con presión sanguínea menor o igual (lte) a 100

In [7]: Usuarios.objects.filter(id=1014181234, cedula__presion_sanguinea__lte=110)
Out[7]: [<Usuarios: 1014181234 Diego Uribe>]


NOTA: Fíjate un detalle en el filter, use la variable 'cedula', es porque en el ForeignKey le puse ese nombre (una buena practica).



El lunes, 23 de abril de 2012 16:58:33 UTC-3, Diego Alonso Uribe Gamez escribió:
[...]
Reply all
Reply to author
Forward
0 new messages