1

我需要制作一个智能菜单,为此我需要一个多对多关系。

我的模型是:

from django.db import models

    class Health_plan(models.Model):
        a = models.IntegerField ()
        b = models.IntegerField ()

   class Doctors_list(models.Model):

        name = models.CharField(max_length=30)
        hp_id = models.ManyToManyField(Health_plan)

        def __unicode__(self):
            return self.name

如何在数据库中建立这种关系?我正在考虑将health_plans(a,b) 作为列,将医生作为行,用 0 和 1 来标识他们所涵盖的健康计划。

有人告诉我这是对 a 的滥用ManyToManyField,我不知道该采取什么步骤。

帮助表示赞赏

4

4 回答 4

5

Django 的 ORM 已经处理了中间表,因此您不必“在数据库中创建此关系(船)”,但鉴于您的问题,您显然需要了解正确的关系模型规范化 - 如果您不了解使用 Django 的 ORM 和任何其他 sql 东西 FWIW 都无法实现关系模型。

作为记录,在关系模型中,多对多关系被建模为在其他两个表上都有外键的关系(SQL 中的“表”),即:

health_plan(#health_plan_id, name, ...)
doctor(#doctor_id, firstname, lastname, ...)
doctors_health_plans(#health_plan_id, #doctor_id)

所以你的 Django 模型应该是:

class HealthPlan(models.Model):
    # no need to define an 'id' field,
    # the ORM provides one by default
    name = models.CharField(....)

class Doctor(models.Model):
    firstname = models.CharField(....)
    lastname = models.CharField(....)
    health_plans = models.ManyToManyField(HealthPlan, related_name="doctors")

然后,您将能够获得医生的所有 HealthPlans :

  doc = Doctor.objects.get(pk=xxxx)
  doc.health_plans.all()

和健康计划的所有医生:

  plan = HealthPlan.objects.get(pk=xxxx)
  plan.doctors.all()

FineManual(tm) 像往常一样是您的朋友...

于 2013-05-03T13:54:55.553 回答
5

放置health_plansas 列的方法不一定是错误的,但这意味着您有固定数量的健康计划,并且您永远不会添加新计划。

关系数据库中多对多关系的传统做法是在中间引入一个表。此表将仅包含医生和健康计划之间的关联。

如果您有一个Doctor包含以下内容的表:

id    name
1     foo
2     bar

还有一张HealthPlan桌子:

id    model
1     a
2     b

然后添加一个Doctor_HealthPlan类似于以下的表:

doctor_id    healthplan_id
1            2
2            1
2            2

django 中的ManyToMany字段类型会自动为你创建这个表。您的代码是正确的,但您可能应该重命名hp_idhealth_plans,因为它是一个代理,允许您访问与医生关联的健康计划列表。

于 2013-05-03T13:48:00.457 回答
1

Django 为您创建表格。在您的项目文件夹中运行:

python manage.py syncdb

Health_plan 和 Doctors_list 都是表。“a”和“b”是 Health_plan 中的列。'Name' 和 'hp_id' 是 Doctors_list 中的列。Django 将在每个表中为 id 创建一个列。Django 还将创建一个表“Doctor_list_Health_plan”来存储关系信息。

Django 模型是 Python 类,因此适用 Python 命名约定。使用 HealthPlan 和 Doctor(CapitalizeWord 单数)。

您的字段名称有点抽象。我建议您使用更具描述性的名称。例如:

class HealthPlan(models.Model):
    name = models.CharField()
    extra_care = models.BooleanField()
于 2013-05-03T14:22:05.907 回答
1

您只需要先保存这两个模型,然后将 healthplan 实例添加到医生列表中。Django 将为您处理剩下的事情。

例如 :

doctor_list = Doctors_list(name="Bwire")
health_plan.save()
doctor_list.save()

#Then add the plan to the doctors list.
doctor_list.hp_id.add(health_plan)
于 2013-05-03T13:46:36.393 回答