首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同类型用户之间的许多关系- Django

不同类型用户之间的许多关系- Django
EN

Stack Overflow用户
提问于 2022-04-23 10:04:22
回答 2查看 86关注 0票数 0

我正在建立一个玩具项目,其中包括一个医疗保健信息系统。我想有两种类型的用户:病人和医生。一个病人可以有多个医生,一个医生可以有多个病人。代表这种关系的最好方法是什么?

目前,我有一些类似的内容:

代码语言:javascript
复制
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模型表示这种关系的正确方法是什么?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-23 12:15:57

问题陈述

从长远来看,使用ManyToManyRelationship (M2M)会导致许多问题,首先是对医生进行序列化,然后有效地为病人提供医生。

用两个相关模型的外键为模型中的每个M2M关系创建一个单独的数据库表。这个表在Django也无法进行进一步的操作。

所以会有两个数据库来定义一个特定的医生和一个病人的关系。从长远来看,维持这两种关系可能会导致分歧。另外,获取信息也不是一项统一的任务。

如果您尝试创建/更新信息,这也会造成问题,因为处理嵌套数据将非常复杂。

解决方案

最好的解决方案是遵循RESTful API范例。

我们将删除DoctorPatient类中的所有Patient关系,然后在models.py中创建一个新的模型来定义医患关系:

代码语言:javascript
复制
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:

  • One,对于拥有所有医生的医生,对于拥有所有医生的病人。--

假设模型DoctorPatient作为DoctorPatientSerializer有一个django序列化程序,则可以在api.py中将视图集定义为:

代码语言:javascript
复制
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))
票数 0
EN

Stack Overflow用户

发布于 2022-04-23 11:15:50

在医生面前跳过many2many。你可以让病人的医生通过病人。通过.add,您可以为病人设置医生

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71978677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档