2013-05-03 158 views
1

我需要制作一个智能菜单,为此我需要一个ManyToMany关系。Django 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的滥用,我不知道这一步采取。

帮助表示赞赏

回答

3

puting的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 

ManyToMany django中的字段类型将自动为你创造这张桌子。您的代码是正确的,但您应该将hp_id重命名为health_plans之类的内容,因为它是允许您访问与医生相关的健康计划列表的代理。

+0

所以在我的健康计划表,我也过得:'类Health_plan(models.Model): 名= models.Charfield(max_lenght = 10)'---->和联接表医生身份证,我把多个health_plan ID? – ClaudioA 2013-05-03 13:53:45

+0

连接表由django管理。你的'Health_Plan'应该包含一个名字,并且你的医生必须有一个'ManyToMany'字段,它绑定到'Health_Plan'。 – 2013-05-03 13:58:24

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) 
4

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() 

和所有的医生为HealthPlan:

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

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

1

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

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()