
Bernardo Augusto García Loaiza
PreguntaField.choice. Haciendo que las opciones salgan dinámicamente con una llave foránea

Bernardo Augusto García Loaiza
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?