对问题的更新答案:如何在显示药物时获得查询值(来自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 - 细胞毒素
感谢您的帮助 皮特
(太小汉堡回答我自己的问题,因此编辑原始问题!)
答案 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
)的内容将模式同步到您现在可读的数据模型。