Я создаю игрушечный проект, состоящий из информационной системы здравоохранения. Я хочу иметь два типа пользователей: пациенты и врачи. У пациента может быть несколько врачей, а у врача может быть несколько пациентов. Как лучше представить эту связь?
В настоящее время у меня есть что-то похожее на это:
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? Спасибо!
Просто объявите отношение ManyToManyField
либо в модели Doctor
, либо в Patient
, но не в обоих.
пропустить много-много у врачей. Вы можете получить врача пациента через пациента. Через .add можно назначить врача пациенту
Использование ManyToManyRelationship (M2M) в долгосрочной перспективе приведет ко многим проблемам, начиная с эффективной сериализации пациентов для врачей и врачей для пациентов.
Для каждого отношения M2M в модели создается отдельная таблица базы данных с внешними ключами двух связанных моделей. Эта таблица также недоступна в Django для дальнейших операций.
Таким образом, было бы две базы данных, определяющие отношение конкретного врача к конкретному пациенту. Сохранение этих двух отношений может привести к расхождениям в долгосрочной перспективе. Кроме того, получение информации не будет единообразной задачей.
Это также создаст проблему, если вы попытаетесь создать/обновить информацию, поскольку обработка вложенных данных будет сложной.
Лучшее решение — следовать парадигме RESTful API.
Мы отбросим все отношения M2M в классах Doctor
и 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. Он также обрабатывает это отношение в одном месте.
Теперь можно создать два отдельных Django ViewSet, если вы хотите создать два отдельных API для поиска по идентификаторам для заданных отношений:
Предполагая, что существует сериализатор django для модели DoctorPatient
как DoctorPatientSerializer
, наборы представлений могут быть определены в 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))
Почему это не работает? Вроде нормально на самом деле