我正在尝试创建一个处理实验室分析的应用程序--类似于实验室信息系统(LIS)
问题是我不知道该采取哪种方法。
我打算这样做:
“分析”表--由分析的“名称”、"ID“组成
“探测”表--“名称”、"ID“、”引用“、”价值“、”测量“。
此外,探测将具有将其链接到特定“分析”实例的字段。
因此,它将是“分析#1”-> "PROBE1","PROBE2","PROBE3“
“分析#2”-> "PROBE1“"PROBE3”
诸若此类。
操作人员应该能够在一个“视图”(如“实验室设置”)和另一个视图中通过前端向此分析添加新的分析和探测,以输入此分析实例的值(所有分析实例都将链接到某个“访问”(服务案例))。
我应该采取什么方法来规划应用程序和模型?它是一些元类,还是仅仅是多个表链接“多到一个”或“多个多义”?
如有任何建议,我将不胜感激!
发布于 2022-07-26 15:59:36
关于这一点,没有什么是ManyToOne关系无法处理的特别复杂的。你的模特会是这样的:
class Visit(models.Model):
...
class Analysis(models.Model):
visit = models.ForeignKey(Visit, ...
...
class Probe(models.Model):
analysis = models.ForeignKey(Analysis, ...
...如果许多探针可以附加到不同的分析或分析访问,然后使用ManyToManyField而不是ForeignKey,请注意,在Django中处理m2m的工作方式与m21关系不同。
https://docs.djangoproject.com/en/4.0/topics/db/examples/many_to_one/
https://docs.djangoproject.com/en/4.0/topics/db/examples/many_to_many/
发布于 2022-07-30 14:04:33
谢谢你的回答!
目前,如果有人感兴趣的话,我正在做类似的事情。也许有更简单的方法,但到目前为止,它符合我的需要。
import uuid
from django.db import models
# Create your models here.
class Patient(models.Model):
class Gender(models.TextChoices):
male = "Муж"
female = "Жен"
surname = models.CharField("Фамилия", max_length=200)
name = models.CharField("Имя", max_length=200)
fathname = models.CharField("Отчество", max_length=200)
created = models.DateTimeField("Добавлен", auto_now_add=True)
id = models.AutoField("Идентификатор", primary_key=True)
dateofbirth = models.DateField("Дата рождения", null=True, blank=True)
gender = models.CharField("Пол", max_length=3, choices=Gender.choices, default=Gender.male)
snils = models.DecimalField("СНИЛС", max_digits=11, decimal_places=0, null=True, blank=True)
class Meta:
ordering = ['-created']
def returnFIO(self):
return self.surname + " " + self.name + " " + self.fathname
def returnAge(self):
import datetime
return (datetime.date.today() - self.dateofbirth) / 365
def __str__(self):
return self.surname + " " + self.name + " " + self.fathname
class Visit(models.Model):
patient = models.ForeignKey(Patient, on_delete=models.CASCADE, verbose_name="Пациент")
id = models.AutoField("Идентификатор", primary_key=True)
created = models.DateTimeField("Добавлен", auto_now_add=True)
class Meta:
ordering = ['-created']
def returnCreated(self):
return self.created
def __str__(self):
return str(self.id) + " / " + str(self.created)
from django.db import models
import uuid
from patients.models import Visit
# Create your models here.
class Analiz(models.Model):
name = models.CharField(max_length=200, blank=True, null=True)
description = models.CharField(max_length=200, blank=True, null=True)
id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)
def __str__(self):
return str(self.name)
class AnalizInst(models.Model):
analiz = models.ForeignKey(Analiz, on_delete=models.CASCADE, null=True)
id = models.AutoField(primary_key=True)
created = models.DateTimeField(auto_now_add=True)
related_to_visit = models.ForeignKey(Visit, on_delete=models.CASCADE, null=True)
def __str__(self):
return str(self.analiz) + ' / ' + str(self.id)
class Measurement(models.Model):
id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)
name = models.CharField(max_length=200, blank=True, null=True)
def __str__(self):
return self.name
class Probe(models.Model):
name = models.CharField("Название теста", max_length=200, blank=True, null=True)
description = models.CharField("Описание", max_length=200, blank=True, null=True)
id = models.UUIDField("Идентификатор", default=uuid.uuid4, unique=True, primary_key=True, editable=False)
related_to_analiz = models.ForeignKey(Analiz, on_delete=models.CASCADE, null=True, verbose_name="Привязка к анализу")
digits = models.IntegerField("Цифр после запятой", null=True, blank=True)
measurement = models.ForeignKey(Measurement, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="Измерение")
probeIsDigital = models.BooleanField("Числовой", default=True)
referenceText = models.CharField("Референс текст", max_length=50, blank=True, null=True)
referenceMin = models.DecimalField("Референс MIN", max_digits=10, decimal_places=5, null=True, blank=True)
referenceMax = models.DecimalField("Референс MAX", max_digits=10, decimal_places=5, null=True, blank=True)
defaultInUse = models.BooleanField("Включен по умолчанию", default=True)
hl7Name = models.CharField("Имя в анализаторе", max_length=200, blank=True, null=True)
defaultText = models.CharField("Текст значения по умолчанию", max_length=200, blank=True, null=True)
def __str__(self):
return str(self.name)
class ProbeInst(models.Model):
value = models.DecimalField("Значение", max_digits=10, decimal_places=5, null=True, blank=True)
textvalue = models.CharField("Текстовое значение", max_length=200, blank=True, null=True)
probe = models.ForeignKey(Probe, on_delete=models.CASCADE, null=True, verbose_name="Тест")
id = models.AutoField("Идентификатор", primary_key=True)
related_to_analyse = models.ForeignKey(AnalizInst, on_delete=models.CASCADE, null=True, verbose_name="Привязка к анализу")
created = models.DateTimeField("Создан", auto_now_add=True)
inUse = models.BooleanField("В работе", default=True)
def __str__(self):
return str(self.probe)此外,我还计划构建一些用于手工输入的UI和表单输入,并与HL7标准进行一些集成,以直接从实验室分析器加载数据。
Django是迄今为止我在编程中遇到的最好的事情)
https://stackoverflow.com/questions/73112578
复制相似问题