Django ManyToMany Field

时间:2013-05-03 13:34:58

标签: python database django model many-to-many

我需要制作一个智能菜单,我需要一个ManyToMany关系。

我的模特是:

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来识别其覆盖的health_plans。

有人告诉我这是对ManyToManyField的误用,我不知道要采取什么措施。

帮助表示赞赏

4 个答案:

答案 0 :(得分:4)

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

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

如果您的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_id重命名为health_plans,因为它是一个代理,允许您访问与医生相关的健康计划列表。

答案 1 :(得分:4)

Django的ORM已经处理了中间表,因此您不必“在数据库中建立这种关系(发货)”,但是根据您的问题,您显然需要了解正确的关系模型规范化 - 如果您不这样做了解Django的ORM无法获得的关系模型,也不了解FWIW的任何其他sql东西。

对于记录,在关系模型中,多对多关系被建模为关系(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")

然后你就可以获得Doctor的所有HealthPlans:

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

和健康计划的所有医生:

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

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

答案 2 :(得分: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)

答案 3 :(得分: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()