2016-07-27 9 views
0

多くの場合、単一の医薬品には混乱を招く「ニックネーム」が多いことがあります。だから私はこの問題を解決するための小さなDjangoアプリを作ろうとしています。Djangoを使用した多対多のデー​​タベース設計

何がすべきかは、薬物名(non_proprietary_name)をその「ニックネーム名」(proprietary_name)またはその逆にするかどうかです。

たとえば、「アスピリン」および「ASS」は、「アセチルサリチル酸」の専売名です。

これをもう少し複雑にするために、小さなWikiページとカテゴリを追加することにしました(また、薬物はさまざまなカテゴリに分類できます)。

悲しいことに、私はデータベース設計に慣れていないので、少し助けが必要です。

私がこれまで持っているもの:私はnon_proprietary_nameに関連することができproprietary_name持っている場合

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> 

を、私はトラブルになっを抱えています私が独占的なものを入力すると、すべてのnon_proprietary_names。これは私のデータベースの問題ですか、それとも他に何か不足していますか?

編集:コメントに基づいて

新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プロパティを、そしてProprietaryNameの他のルックアップのためのmediawikiプロパティ:クラス名ではなく、アンダースコア)にキャメルケースを使用しています。その詳細はdocumentationにあります。

+0

再度、お返事ありがとうございます!オリジナルの質問を編集しました、それはあなたが念頭に置いていたものですか?また、カテゴリーはどうですか?外部キーにも変更する必要がありますか? – theCed7

+0

はい、それは 'category'のような考えでした - それはManyToManyにとどまるべきです。なぜなら、薬物は多くのカテゴリーに分類でき、カテゴリーには多くの薬物が含まれるからです。 – rafalmp

1

まず各エントリはちょうどDrugに関するすべての情報を記録しているので、あなたのモデル名Mediwikiは簡単ではありません。だからちょうどそれを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について。しかし、1 proprietary_nameは唯一の薬剤を記述することができる場合、あなたは1対多の関係を示すために、モデルProprietary_nameに外部キーとしてDrugを行う必要があります

class Proprietary_name(models.Model): 
    proprietary_name = models.CharField(max_length=100, unique=True) 
    drug = models.ForeignKey(Drug) 
関連する問題