【问题标题】:Django : One model has two foreign keys is this the right approach in this caseDjango:一个模型有两个外键在这种情况下这是正确的方法
【发布时间】:2017-06-02 14:05:00
【问题描述】:

我目前正在学习 Django 模型。这是我目前的情况。我有三个模型

1-Patient_Names
2-Patient_Responses
3-Doctor_Questions

现在这里有多个患者的关系,将由模型Patient_Names 表示。现在每个患者都会对医生提出的问题有特定的回答,这些回答由模型Patient_Responses 表示。因此,Patient_Responses 模型将具有一个字段,该字段是 Patient_Names 模型的外键。此外,由于响应将针对模型 Doctor_Questions 的问题,因此 Patient_Response 具有另一个字段,该字段是模型的外键 @ 987654327@。这是正确的方法吗?一个模型可以有两个外键吗?

Patient_Names                 Doctor_Questions
   |                                  |
   |---------Patient_Responses -------|       
                 |
                 pname = models.ForeignKey(Patient_Names)
                 doctor_questions = models.ForeignKey(Doctor_Questions)  

【问题讨论】:

  • Doctor_Questions 总是一样的吗?那么这绝对是有道理的。一个模型有多个 ForeignKey 的情况经常发生。
  • 医生问题是医生可能会问的问题列表。
  • 方法没问题。该模型可以有不同的 ForeignKeys 以及 M2M 字段。继续并创建一个测试数据库,看看它是如何协同工作的!
  • 建议:这可以移动/复制到 SO 上的文档吗?

标签: django django-models


【解决方案1】:

您在此处实际创建的是多对多关系,在 django 中,ManyToManyField 支持它

案例 1,Patient_Responses 只有两个外键。

你不需要这个模型。只需将其删除并在其余模型之一上添加 ManyToManyField 即可简化代码并访问此字段提供的一组功能

class Patient_Names(models.Model):
    ...
    questions = models.ManyToManyField(Doctor_Questions)

案例 2,Patient_Responses 有两个外键以外的字段。

现在您无法删除 Patient_Responses 模型,但您仍然可以通过将其声明为直通模型来解锁 ManyToManyFields 优势

questions = models.ManyToManyField(Doctor_Questions, through='Patient_Responses')

【讨论】:

  • 谢谢。我对 ManyToManyField 不是很熟悉。在我的情况下,我将有其他字段,所以我将不得不使用情况 2。如果我有 Doctor_Questions 和 Patient_Names 的实例,如果我想从 Patient_Responses 检索记录,你能告诉我查询会是什么样子吗?
  • 什么时候各有一个?
  • 是的,当我有一个 Doctor_Questions 模型实例和一个 Patient_Names 模型实例时。如果关系是 ManyToManyField,我如何获得相应的 Patient_Responses,假设 Patient_Responses 有一个单独的模型和一些其他字段(案例 2)?
  • 在案例 2 中,它非常直接 Patient_Responses.objects.filter(pname=patient, doctor_quetions=doctor)
  • 我真的强烈建议你阅读多对多上的文档页面,如果你不这样做,你最终会写很多你不需要写的代码(即复制已经提供的功能django)
猜你喜欢
  • 2013-07-28
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 2019-02-19
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
相关资源
最近更新 更多