我想在字段类型Field.choice下的某些模型中使用某些属性
您的数据模型的上下文如下:
我有模型/表格Patient
和模型/表格CorporalStructure
,后者指的是身体的不同部位,例如肩膀、肘部、前臂等。
通过这种方式,我们有以下关系,其中 1 名患者有许多身体结构。通过这种类型的关系,在桌子上生成一个ForeignKey
调用Patient_id
CorporalStructures
这意味着每次我想创建一个身体结构时,我必须根据我对系统的构想说明它属于哪个患者,我不想要哪个。
我的 body_structure/models.py 文件如下:
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)
我想要做的是,当要在模型中创建患者时,Patient
以其形式指定要检查该患者的哪些身体结构,因此在患者模型中,我还需要一个字段类型为 Field.choice 的 this. ,只是它已经根据先前指定的属性调用在模型CorporalStructures
中创建的对象或实例。name
这就像从 Patient 模型查询 CorporalStructure 模型并CorporalStructure.name
在 Field.choice 类型的属性中呈现该数据(说什么)
文档中的Django提出了它
请注意,选择可以是任何可迭代的对象——不一定是列表或元组。这使您可以动态构建选择。但是,如果您发现自己的黑客选择是动态的,那么您最好使用带有 ForeignKey 的适当数据库表。选择适用于变化不大的静态数据(如果有的话)。
我的病人模型是这个 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)
当我将此字段添加到 PatientProfile 模型时
CORPORAL_STRUCTURE_CHOICE =CorporalStructure.objects.all()
corporal_structures = models.CharField(max_length=150, choices=CORPORAL_STRUCTURE_CHOICE, blank=False)
我收到这个错误
django.core.management.base.SystemCheckError: SystemCheckError: 系统检查发现了一些问题:
ERRORS:
userprofile.PatientProfile.corporal_structures: (fields.E005) 'choices' must be an iterable containing (actual value, human readable name) tuples.
而且我了解会发生什么,因为该属性corporal_structures
在放置其 property 时choices
,期望它是一个列表或元组或任何可以对其进行迭代的元素,而我传递给它的是 ORM 类型查询的结果,这是我CorporalStructures
之前保存在模型中的数据。
CORPORAL_STRUCTURE_CHOICE =CorporalStructure.objects.all()
corporal_structures = models.CharField(max_length=150, choices=CORPORAL_STRUCTURE_CHOICE, blank=False)
Patient
我对我如何看待模型与模型之间的关系的概念也有一些疑问CorporalStructure
:
我希望当我保存患者的记录时,我可以选择治疗该患者的身体结构。基本逻辑告诉我1个病人有很多身体结构,但是当我Patient_id
在CorporalStructures表中输入作为外键时,我得到的是每次创建一个身体结构时,我必须选择它所属的病人,这样:
当我想要的是能够以这种方式详细说明 Field.choice 字段(它的多个选项)时
但在 PatientProfile 的模型形式中。
我怎样才能实现我的目标?
我知道这更多的是设计问题...我需要外键还是可以简单地调用多个 Field.choice 信息而不需要 FK CorporalStructure
?PatientProfile
应该注意的是,我验证这一点的表单在 django admin 中。
任何指导将不胜感激。
我认为(我可能错了)问题可能源于建模。一个患者可以有多个身体结构,但一个身体结构也可以“属于”多个患者或由多个患者共享。也就是说,你有一个NN关系,而不是一个1-N。
我会将“身体结构”模型重新转换为“身体结构类型”。您放入变量中的
CORPORAL_STRUCTURE_CHOICES
数据应该作为数据库中的数据,而不是变量中的数据。如有必要,这还允许您添加新的“身体结构类型”,而无需将它们分配给任何患者。要保存每个患者的具体数据,您将需要第三个表,一个中间表,仅存储“患者”和“身体结构类型”的外键,以及您需要与该患者关联的其余数据还有那个肢体
例如,要存储“menganito” (id_patient 21 ) 具有40º的肩部延伸 (id_extension 23 ),必须在新表中使用 data 创建一条记录
(paciente_id=21, tipo_extremidad_id=23, valor=40)
。