2011-08-08 61 views
1

問題的更新回答:如何在顯示藥物時獲得查找值(來自Atc)以在交易表(藥物)上顯示?django ForeignKey display

解決方案,使用嵌入在模型本身的關係薩維里奧的做法:

models.py

class Atc(models.Model): 
    id = models.CharField(max_length=60, primary_key=True, db_column='ID') 
    txt = models.CharField(max_length=690, db_column='TXT') 
    class Meta: 
     db_table = u'ATC' 
    def __unicode__(self): 
    return u"%s - %s" % (self.id, self.txt) 

class Drug(models.Model): 
    id = models.CharField(max_length=64, primary_key=True, db_column='ID') 
    atc = models.ForeignKey(Atc, db_column='ATCCD') 
    pricetopharm = models.FloatField(db_column='PRICETOPHARM') 
    brandnm = models.CharField(max_length=135, db_column='BRANDNM') 
    drugnm = models.CharField(max_length=240, db_column='DRUGNM') 
    class Meta: 
     db_table = u'DRUGS' 
    def __unicode__(self): 
    return u"%s - %s" %(self.drugnm, self.formandstrength) 

而且在admin.py

class DrugsAdmin(admin.ModelAdmin): 
    fieldsets = [ 
     (None,    {'fields': ['id']}), 
     ('ATC',   {'fields': ['atc','brandnm'] }), 
     (None,   {'fields': ['drugnm']}), 
     ('Prices',  {'fields': ['pricetopharm']}), 
    ] 
    search_fields = ['drugnm','brandnm'] 

admin.site.register(Drug, DrugsAdmin) 
admin.site.register(Atc) 

的關鍵點是加到models.py

atc = models.ForeignKey(Atc, db_column='ATCCD') 

與藥物(事務,而不是參考表)和

('ATC',   {'fields': ['atc','brandnm'] }), 

到admin.py字段集來表示多對一的關係。

現在,admin.py的內容不太相關(它應該在MTV哲學中)。此外,以單數(Drug,not Drugs)重命名對象是有幫助的,如果沒有別的, (即藥品不Druggs)。去掉重複的小號的的 結果是藥物顯示屏顯示ID的下拉框+ TXT如P04H11 - 細胞毒素

感謝您的幫助球員 皮特

(太初級漢堡回答我自己的問題,因此編輯原始問題!)

回答

0

爲什麼不

class Atc(models.Model): # in models.py 
    drug = models.ForeignKey('Drug') 
    description = models.CharField(max_length=10000) 
    def __unicode__(self): return u"%s - %s" % (self.id, self.description) 

class AtcInline(admin.StackedInline): # in admin.py 
    # set option for not being able to add more than one. 
    model = Atc 
    fields = ['description'] 

這將權形式的內聯部分顯示您的藥物例如相關的空管。

(也可能是有趣的是,一般Django模型在單數命名,如Drug代替Drugs這是Drug.objects.filter()語義正確,drug = Drug()等)

編輯:在DB進一步考慮模式和數據模型

看起來您有一個以前的數據庫模式可供使用。如果你不能改變列名,你至少可以給你的屬性,更有意義的名稱,那麼代碼更可讀:

class AtcClassification(models.Model): 
    code = models.CharField(max_length=60, primary_key=True, db_column='ID') 
    description = models.CharField(max_length=690, db_column='TXT') 

class Drug(models.Model): 
    id = models.CharField(max_length=64, primary_key=True, db_column='ID') 
    atc_classification = models.ForeignKey(AtcClassification, db_column='ATCCD') 
    price_to_pharmacy = models.FloatField(db_column='PRICETOPHARM') 
    brand_name = models.CharField(max_length=135, db_column='BRANDNM') 
    drug_name = models.CharField(max_length=240, db_column='DRUGNM') 
    form_and_strength = models... 

    class Meta: 
     db_table = u'DRUGS' 

    def __unicode__(self): 
     return u"%s - %s" %(self.drug_name, self.form_and_strength) 

    def atc_description(self): return self.atc_classification.description 
    def atc_code(self): return self.atc_classification.code 

如果你也擁有DB模式,一旦數據模型完成後,使用像南遷移(db.rename(table_name, old_column_name, new_column_name))這樣的模式同步到您現在可讀的數據模型。

+0

謝謝Saverio。這是我猜的最合理的方法:返回並調整models.py以開始。當我按照我的方式工作時,會更新! – Pete855217

0

如何你是否在提取該描述?如果你有任何代碼發佈它,所以也許我們可以幫助更多!

你必須使用你的notesid來獲取notesinline對象並顯示它!

fetched_note = NotesInline.objects.filter(id=notesid) 

其中notesid是你DrugsAdmin的對象變量:)

+0

謝謝Samuele--我沒有提取任何東西,所以我會按照你的說法進行研究。 – Pete855217

+0

Samuele - 按要求提供更多代碼 - 對不起,這是更具體的,我試圖在原始發佈之前簡化問題;) – Pete855217