2013-05-03 4 views
1

Мне нужно сделать умное меню, для которого мне нужно отношение ManyToMany.Django ManyToMany Field

Моя модель:

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

Подход кладя в 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)' ----> и на столе присоединиться к доктор id я поставил более одного идентификатора health_plan? – ClaudioA

+0

Таблица объединений управляется django. Ваш «Health_Plan» должен содержать имя и ваш врач, поле «ManyToMany» привязано к «Health_Plan». –

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

ORM Django уже заботится о промежуточной таблице, поэтому вам не нужно «делать это отношение (судно) в базе данных», но, учитывая ваш вопрос, вам, очевидно, нужно узнать о правильной нормализации реляционной модели - если вы Не понимайте реляционную модель, которую вы не получите нигде с ORM Django, ни с каким-либо другим файлом sql FWIW.

Для записи, в реляционной модели, многие ко многим отношений моделируются как отношение («стол» в SQL) с внешними ключами на оба других таблицах, а именно:

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

Так что ваш Джанго модели должны быть:

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 (тм) является вашим другом, как обычно ...

1

Джанго создает для вас рабочих таблиц. В папке вашего проекта:

python manage.py syncdb 

Health_plan и Doctors_list - это обе таблицы. 'a' и 'b' - столбцы в Health_plan. «Имя» и «hp_id» - это столбцы в списке Doctors_list. Django создаст столбец для идентификатора в каждой таблице. Django также создаст таблицу «Doctor_list_Health_plan» для хранения информации о соотношении.

Модели Django являются классами Python, поэтому применяются соглашения об именах Python. Используйте HealthPlan и Doctor (Largeize).

Ваши имена полей немного абстрактны. Я предлагаю вам использовать более описательные имена. Например:

class HealthPlan(models.Model): 
    name = models.CharField() 
    extra_care = models.BooleanField() 
Смежные вопросы