我需要制作一个智能菜单,我需要一个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
的误用,我不知道要采取什么措施。
帮助表示赞赏
答案 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()