如何最好地为预订应用程序创建连接?

How to best create connections for a booking app?

我是来自 Firebase 世界的 Django 和关系数据库的新手。我无法确定医患预约应用程序的最佳模型以及关系型 DBS 的最佳工作方式;我想通过现在做好工作来最大程度地减少未来的问题。我将在后端使用 Django 和 Django Rest Framework 来提供 React 前端。

到目前为止,我已经在 clinic 应用程序中创建了这些模型。 PatientsSecretaries 将成为用户的一部分,Doctors 也是如此。然后我为 API.

创建序列化器和视图集
class Clinic(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField()
    accepted = models.BooleanField(default=False)

class Doctor(models.Model):
    clinic = models.ManyToManyField(
        Clinic, related_name="doctor")  
    first_name = models.CharField(max_length=200)
    last_name = models.CharField(max_length=200)
    email = models.EmailField(max_length=240, default="email")
    appointment_duration = models.IntegerField(default=20)

class Secretary(models.Model):
    clinic = models.ForeignKey(
        Clinic, on_delete=models.CASCADE, related_name="secretary")  
    name = models.CharField(max_length=200)
    email = models.EmailField(max_length=240, default="email")
    doctors_responsible_for = models.ManyToManyField(Doctor)

class Patient(models.Model):
    first_name = models.CharField(max_length=200)
    last_name = models.CharField(max_length=200)
    email = models.EmailField(max_length=240, default="email")
    date_of_birth = models.DateField()
    age = models.PositiveIntegerField(default=0)
  1. 我应该创建一个用户模型来区分用户(医生、秘书和患者)吗?他们都将能够注册和登录,并且每个人都会在页面上看到不同的内容。我应该只从序列化程序 API return 'is_doctor' 或 'is_secretary' 显示不同的内容吗?

我很困惑如何将用户模型与医生或秘书模型连接起来,例如,或者我什至需要这样做,因为他们都是用户...

  1. 我如何在注册时区分用户(医生、秘书、患者)?例如,他们每个人都有不同的注册表,其中包含 is_doctor、is_secretary?

    的布尔值
  2. 我想不出存储预约的解决方案。我想知道我是否应该创建一个新模型 Bookings 来保存预订,但我不确定这个预订模型是否应该保存每一个预订(从任何病人到任何医生),考虑到这个应用程序将被很多人使用人。还是应该按每位患者和每位医生进行预约?

在这种情况下,秘书还可以手动将预约添加到医生日历并添加患者。

  1. 我正在一个应用程序中构建所有这些,clinic,也许建议为此创建不同的应用程序?

  2. 每位医生都需要有自己的日历才能使用此应用程序,例如 'day 12, blocks of 20mins from 09:00 to 11:30'。我应该创建一个日历模型吗?或者如何最好地实现这一目标?如何最好地提出这个模型?该日历将根据每位医生选择的空闲时间来填充时间块。

首先,我是一个django小白,所以请记住阅读以下内容。

看起来不错 - 我唯一看不到的是你如何 link 病人去诊所和/或医生。

我注意到的另一件事是医生如何拥有多个诊所。我假设每个诊所都有自己的日历,而不是医生本身?或者两者兼而有之?即,即使一位医生在他的日历上有空,他可能在诊所没有房间给病人,因为其他医生的日历会与之冲突。

就个人而言,我不会为诊所创建新的应用程序,除非您想对其进行更详细的建模。最初保持简单。

此外,如果您允许医生、秘书和患者登录您的网站,最好使用自定义用户的 consumer/provider class 模型。想法...

我会开始用更抽象的术语来思考这个问题。 Service/provider/consumer.

但是,我认为您的方向是正确的。

我可以提出一些想法。

Models

我认为您的方向是正确的。您只需将模型 DoctorSecretaryPatient 关联到 User 模型。我建议您创建一个继承自 AbstractUser 的自定义用户模型。 在此模型中,您可以为每种类型的用户添加一个带有选项的选择字段。 link to docs

此外,您需要 link 使用正确模型的用户模型。

  1. 一种方法是在所有用户类型模型中为用户模型设置一个 OneToOneFieldDoctorSecretaryPatient
  2. 或者您可以探索泛型关系。它将为您进一步简化事情。 link to docs.

Signup

您可以在注册时为用户 select 提供一个字段,或者提供单独的 link 以在后端进行注册和处理。类似于 If you are a doctor, click here to signup。在这两种情况下,您都需要覆盖注册过程。

所以注册 link 可以看起来像:/signup/doctor//signup/patient/。所有注册都将使用相同的视图,只是不同的 url kwargs。 link to docs

您可以在表单成功时为用户类型的相关模型创建行。

Booking

是的,您需要创建一个单独的模型,您可以将所有预订存储在该模型中。有多少用户使用您的应用程序并不重要。只需使用一个好的数据库解决方案,比如 Postgres。有一些方法可以优化您的查询,例如索引,暂时不用担心。只需确保保存所有引用,如患者、医生、创建、上次修改、由哪个用户创建、from_datetime、to_datetime 等

最好处理 forms.py 中的 20 分钟预约时段。 您可以创建一个可接受的时间段列表,这样如果将来您想将这个时间更改为 30 分钟,这很容易做到。只需在表单级别处理所有验证,它就可以解决问题。