Cla*_*ioA 1 python database django many-to-many model
我需要制作一个智能菜单,为此我需要一个多对多关系。
我的模型是:
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
Run Code Online (Sandbox Code Playgroud)
如何在数据库中建立这种关系?我正在考虑将health_plans(a,b) 作为列,将医生作为行,用 0 和 1 来标识他们所涵盖的健康计划。
有人告诉我这是对 a 的滥用ManyToManyField,我不知道该采取哪一步。
帮助表示赞赏
放置health_plansas 列的方法不一定是错误的,但这意味着您有固定数量的健康计划,并且永远不会添加新的计划。
关系数据库中多对多关系的传统方法是在中间引入一个表。该表将仅包含医生和健康计划之间的关联。
如果您有一个Doctor包含以下内容的表:
id name
1 foo
2 bar
Run Code Online (Sandbox Code Playgroud)
还有一张HealthPlan桌子:
id model
1 a
2 b
Run Code Online (Sandbox Code Playgroud)
然后添加一个Doctor_HealthPlan类似于以下内容的表:
doctor_id healthplan_id
1 2
2 1
2 2
Run Code Online (Sandbox Code Playgroud)
ManyToManydjango 中的字段类型会自动为你创建这个表。您的代码是正确的,但您可能应该重命名hp_id为类似的名称health_plans,因为它是一个代理,允许您访问与医生相关的健康计划列表。
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)
Run Code Online (Sandbox Code Playgroud)
所以你的 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")
Run Code Online (Sandbox Code Playgroud)
然后您将能够获得所有 HealthPlans for a Doctor :
doc = Doctor.objects.get(pk=xxxx)
doc.health_plans.all()
Run Code Online (Sandbox Code Playgroud)
和所有参加 HealthPlan 的医生:
plan = HealthPlan.objects.get(pk=xxxx)
plan.doctors.all()
Run Code Online (Sandbox Code Playgroud)
FineManual(tm) 像往常一样是您的朋友...
| 归档时间: |
|
| 查看次数: |
5559 次 |
| 最近记录: |