如何最好地为预订应用程序创建连接?
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
应用程序中创建了这些模型。 Patients
和 Secretaries
将成为用户的一部分,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】:我可以提出一些想法。
型号
我认为你是在正确的轨道上。您只需要将模型Doctor
、Secretary
和Patient
关联到User
模型。我建议您创建一个继承自 AbstractUser
的自定义用户模型。
在此模型中,您可以为每种类型的用户添加一个包含选项的选项字段。 link to docs
此外,您需要将用户模型与正确的模型相关联。
-
一种方法是在所有用户类型模型中为用户模型设置
OneToOneField
:Doctor
、Secretary
、Patient
或者您可以探索泛型关系。它将进一步为您简化事情。 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 精灵设置动画? [关闭]