很多时候,单一药物可能会有很多“昵称”,这会让人感到困惑。所以,我正在尝试构建一个小型的Django应用程序来帮助我解决这个问题。使用Django进行多对多数据库设计
它应该做的是将药物acutal名称(non_proprietary_name)引用到它的“昵称”(专有名称),反之亦然。
例如,“阿司匹林”和“ASS”是“乙酰水杨酸”的专有名称。
为了使它复杂一点,我决定添加一个小维基页面和类别(也是一种药物可以分为许多不同的类别)。
不幸的是,我对数据库设计不是很熟悉,所以这就是我需要一点帮助的地方。
我已经走到这一步:
from django.db import models
# Create your models here.
class Proprietary_name(models.Model):
proprietary_name = models.CharField(max_length = 100, unique = True) #nick name
def __str__(self):
return self.proprietary_name
class Category(models.Model):
category = models.CharField(max_length = 100, unique = True)
def __str__(self):
return self.category
class Mediwiki(models.Model):
proprietary_name = models.ManyToManyField(Proprietary_name)
non_proprietary_name = models.CharField(max_length = 100, unique = True) # actual name
category = models.ManyToManyField(Category)
wiki_page = models.TextField()
def __str__(self):
return self.non_proprietary_name
~
所以,如果我已经得到了我proprietary_name可以涉及non_proprietary_name:
>>> Mediwiki.objects.get(proprietary_name__proprietary_name='Aspirin')
<Mediwiki: acetylsalicylic acid>
不过,我有麻烦所有非专有名称当我输入专有名称时。这是我的数据库的问题还是我缺少其他东西?
编辑:
基于评论新models.py:
from django.db import models
# Create your models here.
class Category(models.Model):
category = models.CharField(max_length = 100, unique = True)
def __str__(self):
return self.category
class Mediwiki(models.Model):
non_proprietary_name = models.CharField(max_length = 100, unique = True)
category = models.ManyToManyField(Category)
wiki_page = models.TextField()
def __str__(self):
return self.non_proprietary_name
class ProprietaryName(models.Model):
proprietary_name = models.CharField(max_length = 100, unique = True)
non_proprietary_name = models.ForeignKey(Mediwiki)
def __str__(self):
return self.proprietary_name
所以,它的工作原理!但我不确定为什么..这是做这件事的最好方法吗?另外,什么类别?他们是否应该改变外键?
>>> Mediwiki.objects.get(proprietaryname__proprietary_name="Aspirin")
<Mediwiki: acetylsalicylic acid>
>>>
>>> ProprietaryName.objects.get(proprietary_name="Aspirin").non_proprietary_name
<Mediwiki: acetylsalicylic acid> # Works also, what's preferable?
>>>ProprietaryName.objects.filter(non_proprietary_name__non_proprietary_name="acetylsalicylic acid")
[<ProprietaryName: Aspirin>, <ProprietaryName: ASS>]
>>>
你尝试了什么? –