2011-08-08 16 views
1

質問に回答しましたか?:Drugを表示すると、取引テーブル(Drugs)に検索値(Atcから)を表示するにはどうすればよいですか?モデル自体に関係を埋め込むサヴェリオのアプローチを使用してdjango ForeignKey表示

ソリューション、:

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) 

にキーポイントが追加になっていますto models.py

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

(トランザクションは、テーブルを参照しない)とadmin.pyフィールドセットへ

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

は多対1の関係を表現するために。

ここで、admin.pyの内容は、MTVの哲学にあるはずです。また、単なる(Drug、not Drugs)のオブジェクトの名前を変更すると、 。(。つまり、薬ではないDruggs)重複したSさんのRID 結果は、薬物のディスプレイである例えば、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'] 

である。これは、右のフォームのインライン部分にあなたの薬物インスタンスの関連ATCが表示されます

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

(また、一般的なモデルがDrug代わりのDrugsのように、単数形で命名されている。これはDrug.objects.filter()drug = Drug()などと意味的に正しいジャンゴことは興味深いかもしれません。)

編集:DB上の更なる検討事項スキーマとデータモデル

使用する前の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

どのようにその説明を取得していますか?あなたがコードを投稿していれば多分私たちはもっと助けることができます!

notesinlineオブジェクトをフェッチして表示するには、notesidを使用する必要があります。 notesidがあなたのDrugsAdminのオブジェクト変数:)

+0

ありがとうSamuele - 私は何もフェッチしていないので、あなたが言うようにフィールドを取得することを研究します。 – Pete855217

+0

Samuele - 要望に応じてより多くのコードを提供 - より具体的に申し訳ありませんが、私は元の投稿の前に質問を単純化しようとしました;) – Pete855217

関連する問題