django ForeignKey显示

时间:2011-08-08 10:07:29

标签: python django

对问题的更新答案:如何在显示药物时获得查询值(来自Atc)以显示在交易表(药物)上?

解决方案,使用Saverio将关系嵌入模型本身的方法:

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哲学中。而且,以单数形式重命名对象(药物,而不是药物)是有帮助的,如果没有别的除去它重复的s(即药物不是药物)。 结果显示药物显示id + txt的下拉框例如。 P04H11 - 细胞毒素

感谢您的帮助 皮特

(太小汉堡回答我自己的问题,因此编辑原始问题!)

2 个答案:

答案 0 :(得分:0)

你是如何获取该描述的?如果您有任何代码发布,那么也许我们可以帮助更多!

你必须使用你的notesid来获取notesinline对象并显示它!

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

其中notesid是您的DrugsAdmin的对象变量:)

答案 1 :(得分: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']

这将在表单的内联部分显示您的Drug实例的相关atc。

(另外,值得注意的是,通常django模型以单数形式命名,如Drug而不是Drugs。这在语义上与Drug.objects.filter(),{{1等等)

编辑:对数据库架构和数据模型的进一步考虑

您似乎使用了以前的数据库架构。如果您无法更改列名,则至少可以为属性赋予更有意义的名称,因此代码更具可读性:

drug = Drug()

如果您还拥有数据库模式,则在数据模型完成后,使用类似南迁移(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 )的内容将模式同步到您现在可读的数据模型。