2016-07-27 15 views
0

Oft kann ein einzelnes Medikament viele "Spitznamen" haben, die verwirrend werden. Also versuche ich eine kleine Django-App zu bauen, die mir dabei hilft.Viele-zu-viele Datenbank-Design mit Django

Was es tun sollte, ist entweder die Drogen acutal Name (non_proprietary_name) auf seinen "Spitzname" (proprietary_name) oder umgekehrt.

Zum Beispiel sind "Aspirin" und "ASS" der geschützte Name für "Acetylsalicylsäure".

Um es ein wenig weiter zu komplizieren habe ich beschlossen, eine kleine Wiki-Seite und Kategorien hinzuzufügen (auch ein Medikament kann in viele verschiedene Kategorien fallen).

Leider bin ich nicht sehr vertraut mit Datenbank-Design, das ist, wo ich ein bisschen Hilfe brauche.

Was ich bisher habe:

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 

~ 

Also, wenn ich die proprietary_name habe ich auf die non_proprietary_name beziehen können:

>>> Mediwiki.objects.get(proprietary_name__proprietary_name='Aspirin') 
<Mediwiki: acetylsalicylic acid> 

Aber ich habe Probleme bekommen alle nicht-proprietären_namen, wenn ich den proprietären_namen eingeben. Ist das ein Problem mit meiner Datenbank oder fehlt mir etwas anderes?

EDIT:

New models.py basierend auf den Kommentaren:

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 

Also, es funktioniert! Aber ich bin nicht so sicher, warum .. Ist das der beste Weg, es zu tun? Was ist mit den Kategorien? Sollten sie auch auf Fremdschlüssel umgestellt werden?

>>> 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

Was haben Sie versucht? –

Antwort

1

Es kann viele Markennamen, aber keine Der identische Markenname kann mehr als einem nicht-proprietären (generischen) Medikament zugeordnet werden. Daher müssen Sie Ihre Beziehung von "Viele-zu-Viele" zu "Eins-zu-Viele" (nb.verwenden Camelcase in Klassennamen nicht Unterstrichen):

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) 

dann Sie alle proprietären Medikamente für einen nicht-geschützten Namen bekommen kann mit Mediawikiproprietaryname_set Eigenschaft s und ProprietaryName‘ s mediawiki Eigenschaft für die anderen Nachschlag. Mehr dazu in der documentation.

+0

Nochmals vielen Dank für Ihre Antwort! Bearbeitete die ursprüngliche Frage, ist das, was Sie im Sinn hatten? Was ist mit den Kategorien? Sollte das auch auf Fremdschlüssel geändert werden? – theCed7

+0

Ja, das war die Idee, wie für "Kategorie" - es sollte bleiben ManyToMany als Droge kann in viele Kategorien fallen und eine Kategorie wird viele Drogen enthalten. – rafalmp

1

Erster Modellname Mediwiki ist nicht einfach, weil jeder Eintrag nur wird alle Informationen über eine Drug Aufnahme. Also ändere das einfach zu Drug würde mehr Sinn machen.

In Ihrem aktuellen Design verwenden Sie M2M-Felder, die anzeigen, dass ein proprietary_name für mehrere Medikamente verwendet werden könnte. Wenn Sie alle Drug non_proprietary_names wollen zurück, wenn Sie proprietary_name eingeben, tun gerade:

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

prüfen django doc über values_list.

Wenn jedoch ein proprietary_name nur ein Medikament beschreiben können, sollten Sie Drug als Fremdschlüssel auf Modell machen Proprietary_name einer Eins-zu-viele-Beziehung, um anzuzeigen:

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