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

Posted

技术标签:

【中文标题】如何最好地为预订应用程序创建连接?【英文标题】:How to best create connections for a booking app? 【发布时间】:2021-01-07 01:55:11 【问题描述】:

我是来自 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)
    是否应该创建一个用户模型来区分用户(医生、秘书和患者)?他们都将能够注册和登录,并且每个人都会在页面上看到不同的内容。我是否应该从序列化程序 API 返回“is_doctor”或“is_secretary”并从那里显示不同的内容?

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

    在注册时如何区分用户(医生、秘书、患者)?例如,他们每个人都有一个不同的注册表单,其中 is_doctor, is_secretary 是布尔值?

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

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

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

    每位医生都需要有自己的日历才能运行此应用,例如“第 12 天,从 09:00 到 11:30,每 20 分钟一次”。我应该创建一个日历模型吗?或者如何最好地实现这一目标?如何最好地提出这个模型?该日历将填充每个医生选择的可用时间段。

【问题讨论】:

您可能不想要default="email",因为这实际上会将电子邮件地址设置为email,并且在创建时会导致表单验证错误,或者在您尝试编辑条目时肯定会导致错误(当您实际上没有明确设置 email 值时,即)。 好提示。删除了。 【参考方案1】:

首先,我是一个 django 菜鸟,所以请仔细阅读以下内容。

看起来不错 - 我发现唯一缺少的是您如何将患者与诊所和/或医生联系起来。

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

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

另外,如果您允许医生、秘书和患者登录到您的网站,最好让消费者/提供者类模型继承自自定义用户。想法...

我会开始用更抽象的术语来思考这个问题。服务/供应商/消费者。

但是,我认为你是在正确的轨道上。

【讨论】:

很好的洞察力。我实际上认为每个医生都应该有自己的日历(假设您要预约,您将由医生预约(或者如果通过诊所,这将来自每个医生的日历))。我不明白消费者/提供者类模型是什么(没有运气谷歌搜索) 我只是在考虑服务/提供者/消费者,它更抽象,并且适用于您的诊所应用程序之外的其他领域。即它也可以应用于任何数量的类似商业模式。例如,我在考虑救护车服务,您的日历会有所不同,但不会有太大的不同。此外,想想车库如何使用该应用程序。 IE。车库/机械师/客户/日历。【参考方案2】:

我可以提出一些想法。

型号

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

此外,您需要将用户模型与正确的模型相关联。

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

注册

您可以在注册时提供一个字段供用户选择,或者提供单独的链接来注册和在后端处理事情。像If you are a doctor, click here to signup 这样的东西。在这两种情况下,您都需要覆盖注册过程。

因此,注册链接可能类似​​于:/signup/doctor//signup/patient/。所有注册都将使用相同的视图,只是不同的 url kwargs。 link to docs

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

预订

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

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

【讨论】:

这很有帮助。你对#5有什么想法吗? 我添加了它。检查最后一段。基本上,在 settings.py 中为块持续时间添加一个变量,并在 forms.py 或 models.py 中为持续时间创建选项。所有验证都是表单级别的,因此您可以简单地检查用户提交表单时是否选择了正确的持续时间。

以上是关于如何最好地为预订应用程序创建连接?的主要内容,如果未能解决你的问题,请参考以下文章

如何最好地为 Android MVC 应用程序实现一个内聚的模型层?

如何在 Unity3d 中最好地为 2D 精灵设置动画? [关闭]

如何在 Node.js 中最好地创建 RESTful API [关闭]

如何最好地为 ARC 代表保留自我?

如何有条件地为 Catalyst 编译代码?

如何最好地为 WordPress 博客实施 Google CSE