2013-05-03 203 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()