【发布时间】:2016-12-01 20:00:20
【问题描述】:
通常一种药物可以有很多“昵称”,这会让人感到困惑。所以,我正在尝试构建一个小型 Django 应用程序来帮助我解决这个问题。
它应该做的是将药物的实际名称(non_proprietary_name)引用到它的“昵称”(proprietary_name),反之亦然。
例如,“阿司匹林”和“ASS”是“乙酰水杨酸”的专有名称。
为了更复杂一点,我决定添加一个小的 Wiki 页面和类别(此外,一种药物可以分为许多不同的类别)。
遗憾的是,我对数据库设计不是很熟悉,所以我需要一些帮助。
到目前为止我得到了什么:
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
~
所以,如果我有专有名称,我可以关联到非专有名称:
>>> Mediwiki.objects.get(proprietary_name__proprietary_name='Aspirin')
<Mediwiki: acetylsalicylic acid>
但是,当我输入专有名称时,我无法获取所有非专有名称。这是我的数据库的问题还是我错过了其他东西?
编辑:
基于 cmets 的新 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>]
>>>
【问题讨论】:
标签: python django database database-design