Field.choice. Haciendo que las opciones salgan dinámicamente con una llave foránea

Pregunta de la clase:
Bernardo Augusto García Loaiza

Bernardo Augusto García Loaiza

Pregunta
studenthace 9 años

Field.choice. Haciendo que las opciones salgan dinámicamente con una llave foránea

1 respuestas
para escribir tu comentario
    Bernardo Augusto García Loaiza

    Bernardo Augusto García Loaiza

    studenthace 9 años

    Estoy queriendo trabajar unos atributos en unos modelos bajo el tipo de campo Field.choice

    El contexto de su modelo de datos es el siguiente:

    Tengo el modelo/tabla Patient y el modelo/tabla CorporalStructure en donde este último se refiera a las diferentes partes del cuerpo, como el hombro, codo, antebrazo, etcétera.

    De esta forma se tiene la siguiente relación en donde 1 paciente tiene muchas estructuras corporales.
    Al tener este tipo de relación, se genera un ForeignKey llamado Patient_id en la tabla  CorporalStructures


    Esto quiere decir que cada que quiero crear una estructura corporal debo decir a que paciente pertenece, cosa que no quiero acorde a como tengo concebido mi sistema.

    Mi archivo corporal_structure/models.py es el siguiente:

    from django.db import models from metrics.models import Metric # Create your models here. class CorporalStructure(models.Model): CORPORAL_STRUCTURE_CHOICES = ( ('Escápula',( ('elevación:40°','Elevación:40°'), ('Descenso:10°','Descenso:10°'), ('retracción:25°','Retracción:25°'), ('protracción:30°','Protracción:30°'), ) ), ('Hombro',( ('flexión:150°-170°','Flexión:150°-170°'), ('extensión:40°','Extensión:40°'), ('abducción (separación):160° a 180°','Abducción (separación):160° a 180°'), ('adducción (acercamiento):20° a 40°','Aducción (acercamiento):20° a 40°'), ('rotación interna con hombro aducido (acercado a tórax):70°','Rotación interna con hombro aducido (acercado a tórax):70°'), ('rotación externa con hombro abducido a 90°:60°','Rotación externa con hombro abducido a 90°:60°'), ('rotación interna con hombro a 90° de abducción:70°','Rotación interna con hombro a 90° de abducción:70°'), ('rotación externa con hombro a 90° de abducción:90°','Rotación externa con hombro a 90° de abducción:90°'), ('movimiento de arco horizontal del hombro de afuera hacia adentro: de 40-50° posterior a 130-160° anterior','Movimiento de arco horizontal del hombro de afuera hacia adentro: de 40-50° posterior a 130-160° anterior'), ('*circunducción: sumatoria de los movimientos anteriores','Circunducción: sumatoria de los movimientos anteriores'), ) ), ('Codo', ( ('extensión','Extensión'), ('flexión', 'Flexión'), ) ), ('Antebrazo', ( ('supinación','Supinación'), ('Pronación', 'Pronación'), ) ), ('Carpo', ( ('flexión palmar','Flexión palmar'), ('flexión dorsal (o extensión)', 'Flexión dorsal (o extensión)'), ('desviación ulnar', 'Desviación ulnar'), ('desviación radial', 'Desviación radial'), ('*circunducción: sumatoria de los movimientos anteriores','Circunducción: sumatoria de los movimientos anteriores'), ), ), ('Mano', ( ('aproximación interfalángica','Aproximación interfalángica'), ('separación interfalángica', 'Separación interfalángica'), ('flexión superficial de falanges (se puede hacer en masa, es decir las 5 falanges al tiempo, o de manera individual)', 'Flexión superficial de falanges (se puede hacer en masa, es decir las 5 falanges al tiempo, o de manera individual)'), ('flexión profunda de falanges (se puede hacer en masa, o de manera individual)', 'Flexión profunda de falanges (se puede hacer en masa, o de manera individual)'), ('flexión metacarpofalangica (se puede hacer en masa, o de manera individual)','Flexión metacarpofalangica (se puede hacer en masa, o de manera individual)'), ('extensión de las falanges (se puede hacer en masa o de manera individual)','Extensión de las falanges (se puede hacer en masa o de manera individual)'), ('separación del pulgar','Separación del pulgar'), ('aproximación del pulgar','Aproximación del pulgar'), ('oposición del pulgar','Oposición del pulgar'), ('flexión del pulgar','Flexión del pulgar'), ), ), ) name = models.CharField(max_length=150, choices=CORPORAL_STRUCTURE_CHOICES, blank=False) type = models.CharField(max_length=150, blank=False) freedom_degrees = models.CharField(max_length=150, blank=False) metrics = models.ManyToManyField(Metric) patient = models.ForeignKey('userprofile.PatientProfile', null=True, blank=True) def __str__(self): return '%s' % (self.name)

    Lo que deseo hacer es que cuando se vaya a crear un paciente en el modelo Patient en su formulario se le especifique que estructuras corporales van a examinarse de ese paciente, por lo que en el modelo Patient necesitaría un campo también de tipo Field.choice para ello, solo que sería ya llamar a los objetos o instancias que han sido creadas en el modelo CorporalStructures en cuanto a su atributo name especificado anteriormente.

    Sería algo asi como hacer un query o consulta al modelo CorporalStructure desde el modelo Patient y renderizar esos datos de CorporalStructure.name (por decir cualquier cosa) en un atributo de tipo Field.choice

    Mi modelo Patient es este PatientProfile/models.py

    class PatientProfile(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) #active = models.BooleanField(default=True) full_name = models.CharField(max_length=64) CORPORAL_STRUCTURE_CHOICE =CorporalStructure.objects.all() corporal_structures = models.CharField(max_length=150, choices=CORPORAL_STRUCTURE_CHOICE, blank=False) partner_full_name = models.CharField(max_length=64) partner_phone = models.CharField(verbose_name=u'phone', max_length=25, blank=True) care_provider = models.CharField(max_length=64, blank=False)

    Cuando adicione este campo al Modelo PatientProfile

    CORPORAL_STRUCTURE_CHOICE =CorporalStructure.objects.all() corporal_structures = models.CharField(max_length=150, choices=CORPORAL_STRUCTURE_CHOICE, blank=False)

    Me aparece este error

    ERRORS: userprofile.PatientProfile.corporal_structures: (fields.E005) 'choices' must be an iterable containing (actual value, human readable name) tuples.

    Y entiendo un poco lo que sucede, ya que el atributo corporal_structures al ponerle su propiedad de choices, espera es una lista o tupla o cualquier elemento sobre el cual se pueda iterar y yo lo que le estoy es pasando es el resultado de una consulta tipo ORM, que son los datos que guarde en mi modelo CorporalStructures anteriormente.

    ¿Necesito una llave foránea de CorporalStructure en PatientProfile o se puede llamar de manera simple la información de las múltiples opciones del Field.choice sin necesidad de una F.K?

Curso de Python y Django 2016

Curso de Python y Django 2016

Aprende Python desde cero y crea tu primera aplicación web completa en Django. Entiende las bases del lenguaje, sus funciones, conoce cómo conectarte a bases de datos y termina creando una API REST de manera profesional para tu app.

Curso de Python y Django 2016
Curso de Python y Django 2016

Curso de Python y Django 2016

Aprende Python desde cero y crea tu primera aplicación web completa en Django. Entiende las bases del lenguaje, sus funciones, conoce cómo conectarte a bases de datos y termina creando una API REST de manera profesional para tu app.