Django 多对多字段

Cla*_*ioA 1 python database django many-to-many model

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

我的模型是:

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
Run Code Online (Sandbox Code Playgroud)

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

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

帮助表示赞赏

Mar*_*ard 5

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

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

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

id    name
1     foo
2     bar
Run Code Online (Sandbox Code Playgroud)

还有一张HealthPlan桌子:

id    model
1     a
2     b
Run Code Online (Sandbox Code Playgroud)

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

doctor_id    healthplan_id
1            2
2            1
2            2
Run Code Online (Sandbox Code Playgroud)

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


bru*_*ers 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)
Run Code Online (Sandbox Code Playgroud)

所以你的 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")
Run Code Online (Sandbox Code Playgroud)

然后您将能够获得所有 HealthPlans for a Doctor :

  doc = Doctor.objects.get(pk=xxxx)
  doc.health_plans.all()
Run Code Online (Sandbox Code Playgroud)

和所有参加 HealthPlan 的医生:

  plan = HealthPlan.objects.get(pk=xxxx)
  plan.doctors.all()
Run Code Online (Sandbox Code Playgroud)

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