我正在建立一个玩具项目,其中包括一个医疗保健信息系统。我想有两种类型的用户:病人和医生。一个病人可以有多个医生,一个医生可以有多个病人。代表这种关系的最好方法是什么?
目前,我有一些类似的内容:
class User(AbstractUser):
def serialize(self):
return {
"id": self.id,
"username": self.username,
}
class Doctor(models.Model):
user = models.ForeignKey(User, on_delete=models.SET(get_sentinel_user))
patients = models.ManyToManyField(Patient)
class Patient(models.Model):
user = models.ForeignKey(User, on_delete=models.SET(get_sentinel_user))
doctors = models.ManyToManyField(Doctor)不过,我很确定这不管用。使用django模型表示这种关系的正确方法是什么?谢谢!
发布于 2022-04-23 12:15:57
问题陈述
从长远来看,使用ManyToManyRelationship (M2M)会导致许多问题,首先是对医生进行序列化,然后有效地为病人提供医生。
用两个相关模型的外键为模型中的每个M2M关系创建一个单独的数据库表。这个表在Django也无法进行进一步的操作。
所以会有两个数据库来定义一个特定的医生和一个病人的关系。从长远来看,维持这两种关系可能会导致分歧。另外,获取信息也不是一项统一的任务。
如果您尝试创建/更新信息,这也会造成问题,因为处理嵌套数据将非常复杂。
解决方案
最好的解决方案是遵循RESTful API范例。
我们将删除Doctor和Patient类中的所有Patient关系,然后在models.py中创建一个新的模型来定义医患关系:
class Doctor(models.Model):
user = models.ForeignKey(User, on_delete=models.SET(get_sentinel_user))
class Patient(models.Model):
user = models.ForeignKey(User, on_delete=models.SET(get_sentinel_user))
class DoctorPatient(models.Model):
doctor = models.ForeignKey(Doctor)
patient = models.ForeignKey(Patient)现在,无论何时
然后,可以通过创建类DoctorPatient的实例来建立新的患者-医生关系。
我们取得了什么成就
DoctorPatient模型为M2M关系创建的数据库表建立了一个可访问的模型。它还在一个地方处理这种关系。
现在,如果您希望创建两个独立的API,通过ID查找给定关系,则可以创建两个单独的Django ViewSets:
假设模型DoctorPatient作为DoctorPatientSerializer有一个django序列化程序,则可以在api.py中将视图集定义为:
from rest_framework import viewsets
class DoctorWithPatientsViewSet(viewsets.ModelViewSet):
serializer_class = serializers.DoctorPatientSerializer
filter_backends = (DjangoFilterBackend,)
filterset_fields = "__all__"
lookup_field = 'doctor'
def get_queryset(self):
queryset = models.DoctorPatient.objects.all()
return DoctorPatient.objects.filter(id__in=queryset.values_list('doctor_id',flat=True))
class PatientWithDoctorsViewSet(viewsets.ModelViewSet):
serializer_class = serializers.DoctorPatientSerializer
filter_backends = (DjangoFilterBackend,)
filterset_fields = "__all__"
lookup_field = 'patient'
def get_queryset(self):
queryset = models.DoctorPatient.objects.all()
return DoctorPatient.objects.filter(id__in=queryset.values_list('patient_id',flat=True))发布于 2022-04-23 11:15:50
在医生面前跳过many2many。你可以让病人的医生通过病人。通过.add,您可以为病人设置医生
https://stackoverflow.com/questions/71978677
复制相似问题