2011-08-08 7 views
1

질문에 대한 답변 : 마약을 표시 할 때 거래 테이블 (Drugs)에 조회 값 (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) 

핵심 포인트

추가됩니다 모델 자체의 관계를 내장의 Saverio의 접근 방식을 사용하여

솔루션, 모델에

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

1,515,(트랜잭션 테이블을 참조하지 않음)과 admin.py 필드 셋에

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

은 다 대일 관계를 나타내는.

이제 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'] 

이 잘 형태의 인라인 부분에 약물 인스턴스에 대한 관련 ATC를 표시하지

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

.

편집 (또한,이 drug = Drug() 등, 즉 일반적으로이 Drug.objects.filter()와 의미 론적으로 올바른 대신 DrugsDrug 같이 모델이, 단수 이름이 지정됩니다 장고 것은 흥미로운 일이 될 수 있습니다.) : 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

Thanks Saverio. 이것은 내가 할 수있는 가장 논리적 인 방법입니다. 다시 돌아가서 models.py를 조정하십시오. 나는 그것을 통해 자신의 길을 일한 때 업데이 트됩니다! – Pete855217

0

how 그 설명을 가져 오는거야? 어떤 코드를 게시하고 있다면 우리는 더 많은 것을 도울 수 있습니다!

notesinline 객체를 가져 와서 표시하려면 notesid를 사용해야합니다! notesid이 DrugsAdmin의 개체 변수 :

+0

감사합니다. Samuele - 나는 아무것도 가져 오지 않았으므로, 당신이 말하는 것처럼 필드 가져 오기를 연구 할 것입니다. – Pete855217

+0

Samuele - 요청에 따라 더 많은 코드 제공 -보다 구체적인 것은 유감스럽게 생각하며 원래 게시하기 전에 질문을 단순화하려고 시도했습니다.) – Pete855217

관련 문제