2016-07-27 56 views
0

很多时候,单一药物可能会有很多“昵称”,这会让人感到困惑。所以,我正在尝试构建一个小型的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>] 
     >>> 
+1

你尝试了什么? –

回答

1

可以有很多专有的名字,但没有相同的专有名称可以分配给多种非专有(通用)药物,因此您需要将您的关系从多对多改为一对多(nb。在类名,而不是下划线)使用首字母大写:

class Mediwiki(models.Model): 
    non_proprietary_name = models.CharField(max_length = 100, unique = True) # actual name 
    category = models.ManyToManyField(Category) 
    wiki_page = models.TextField() 

class ProprietaryName(models.Model): 
    proprietary_name = models.CharField(max_length = 100, unique = True) #nick name 
    non_proprietary_name = models.ForeignKey(Mediawiki) 

那么你就可以得到所有专利药品使用Mediawiki非专有名称的proprietaryname_set财产,ProprietaryNamemediawiki属性为其他查找。更多关于documentation

+0

再次感谢您的回复!编辑原始问题,那是你的想法?另外,什么类别?是否应该改为外键? – theCed7

+0

是的,就是这个想法,至于“类别” - 它应该停留ManyToMany作为一种药物可以分为许多类别,一个类别将包含许多药物。 – rafalmp

1

首先型号名称Mediwiki并不简单,因为每个条目只是记录有关Drug的所有信息。所以只要改变Drug会更有意义。

在您当前的设计中,您使用的是m2m字段,这表明一个proprietary_name可用于多种药物。如果你想,当你进入proprietary_name所有Drug non_proprietary_names返回,只是做:

Drug.objects.filter(proprietary_name__proprietary_name='Aspirin') \ 
      .values_list('non_proprietary_name', flat=True).distinct() 

检查Django的文档约values_list

然而,如果一个proprietary_name只能描述一种药物,你应该让Drug为外键模式Proprietary_name指示一个一对多的关系:

class Proprietary_name(models.Model): 
    proprietary_name = models.CharField(max_length=100, unique=True) 
    drug = models.ForeignKey(Drug)