2016-07-24 60 views
0

首先,我知道這個問題可能已經被回答了,但是我打開另外一個問題有兩個原因:顯然,一個是我正在努力Django語法。其次,也許更重要的是,我不太確定我的數據庫設置在這一點上是否有意義。所以,請忍受我。Django:鏈接兩張表

我在醫院工作,我的日常工作之一是,通常一種藥物可以有很多不同的名稱。所以,我認爲用一些Django來練習是一件好事。

基本上我想要兩個數據庫:一個簡單地將藥物「暱稱」鏈接到它的實際名稱。還有一個將實際名稱與一些附加信息聯繫在一起的東西,這些東西是維基頁面的一些內容。

我想出迄今:

(django)[email protected]:~/medwiki$ cat medsearch/models.py 
from django.db import models 

# Create your models here. 

class medsearch(models.Model): 
    proprietary_name = models.CharField(max_length = 100, unique = True) 
    non_proprietary_name = models.CharField(max_length = 100, unique = True) 

    def __str__(self): 
     return self.non_proprietary_name 

class medwiki(models.Model): 
    proprietary_name = models.ForeignKey('medisearch', on_delete=models.CASCADE) 
    cetegory = models.CharField(max_length = 255) 
    #wiki = models.TextField() etc. 

    def __str__(self): 
     return self.proprietary_name 
(django)[email protected]:~/medwiki$ 

所以,我可以添加一個新的「medsearch對象」就好了。但是,當在medwiki處添加「類別」時,我得到__str__ returned non-string (type medsearch)。據推測,因爲medsearch中有多個關鍵字?因此,我懷疑「FroeignKey」不適合這個應用程序,並且我知道在Django中還有其他方法可以鏈接數據庫。但是,我不知道選擇哪一個以及如何正確實施。

希望你們中的一些人有一些想法?

編輯:這裏是我想出迄今:

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

    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) 
    category = models.ManyToManyField(Category) 
    wiki_page = models.TextField() 

    def __str__(self): 
     return self.non_proprietary_name 

現在我可以通過屬性不同的categorys和不同的proprietary_names到一種藥物。迄今爲止效果很好。

因此,當我知道專有的「暱稱」時,查找非專有名稱。

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

但是,我也想顯示所有proprietary_names,當我知道non_proprietary_name。我是否必須進一步更改數據庫設計,還是隻是在這裏錯過了其他一些東西?

+0

「一個單一的藥物可以有很多不同的名字」在你們例子,這表有主的名字,哪一個有其他的名字。 –

+0

你的關於'__str__'的問題在答案中得到了充分的回答,但是你的數據庫設計有嚴重的問題。首先 - 您將專有名稱與非專有(通用)名稱一起存儲;因爲一個通用名稱可能有許多專有名稱,這意味着您將在許多地方存儲相同的名稱,如果需要更正它,不必要地佔用空間並使其成爲惡夢。正確的數據庫設計主題太寬泛以至於無法發表評論甚至是答案,我建議先閱讀一本關於關係數據庫設計的書。 – rafalmp

+0

@François主要名稱將是「non_proprietary_name」。暱稱將是「專有名稱」(s)。 – theCed7

回答

1

如您所知,medwiki上的proprietary_name字段是ForeignKey。您不能直接從__str__方法返回該值,因爲它需要返回一個字符串。你需要將該值轉換成字符串返回之前:要麼使用medsearch實例的默認字符串表示:

return str(self.proprietary_name) 

或選擇特定的字符串字段返回:

return self.proprietary_name.proprietary_name 
2

這會工作:

return self.proprietary_name.proprietary_name 

但這並沒有什麼意義!


的主要問題是你叫的外鍵medsearchproprietary_name

第二個問題只是一個約定。在Python(以及許多編程語言)中,類必須以大寫字母開頭。

下會更好:

class MedSearch(models.Model): 
    proprietary_name = models.CharField(max_length=100, unique=True) 
    non_proprietary_name = models.CharField(max_length=100, unique=True) 

    def __str__(self): 
     return self.non_proprietary_name 

class MedWiki(models.Model): 
    med_search = models.ForeignKey('MedSearch', on_delete=models.CASCADE, related_name='wikis') 
    cetegory = models.CharField(max_length = 255) 
    #wiki = models.TextField() etc. 

    def __str__(self): 
     return self.med_serach.proprietary_name