如何在admin和model中实现外键

时间:2015-01-17 05:34:52

标签: django python-2.7 django-models django-admin

                     Table1                                            

             sett_ num  |  Sett_typ                  

           -----------------------------            

              2014232          N                                         

              2014232          S                             

              2014232          O      

                 Table2
        stt_type_code | stt_typ_name
         ----------------------------
            N            Normal 
            S            OPTIONS 
            O            Index                     

这个数据库如何查找两个表,在表1中我需要通过引用表2显示“Normal而不是N”

我已经实现了这个但问题是我已经使这个变化的字段无法搜索并且过滤器无法正常工作

所以我需要在这里实现外键可以请你帮我解决这个问题。

模型和管理员看起来像这样

Model.py(table 1)

class DLVR(models.Model):
      sett_type = models.CharField(max_length=35, editable=False)
      sett_num = models.CharField(max_length=7, editable=False) 

   Model.py(Table 2)

  class Sttlmnt_typ_Master(models.Model): 
        stt_typ_code = models.CharField(max_length=10, editable=True)
        stt_typ_name =  models.CharField(max_length=35, editable=True)

Admin.py

 class DLVRAdmin(admin.ModelAdmin):
       list_display = ('sett_num','sett_type')
       search_fields=['sett_num','sett_type']
       def sett_type_display(self, obj):
           if Sttlmnt_typ_Master.objects.filter(stt_typ_code=obj.sett_type).first(): 
              sett_type = Sttlmnt_typ_Master.objects.filter(stt_typ_code=obj.sett_type).first()
              return sett_type.stt_typ_name
          else:
             return obj.sett_type 

这是我需要以外键方式实现的方式可以有人帮忙吗?请给我模型和管理员的例子。

1 个答案:

答案 0 :(得分:1)

primary_key参数添加到Sttlmnt_typ_Master.stt_typ_code,然后将DLVR.sett_type更改为外键:

class Sttlmnt_typ_Master(models.Model): 
    stt_typ_code = models.CharField(max_length=10, primary_key=True)
    stt_typ_name =  models.CharField(max_length=35)

    def __unicode__(self):
        return self.stt_typ_name

class DLVR(models.Model):
      sett_type = models.ForeignKey(Sttlmnt_typ_Master)
      sett_num = models.CharField(max_length=7)

管理员将如此简单:

class DLVRAdmin(admin.ModelAdmin):
    list_display = ['sett_type', 'sett_num']
    search_fields=['sett_num','sett_type__stt_typ_name']

要将原始数据设置为DLVR.sett_type(例如,从CSV导入时),请将_id添加到字段名称:

DLVR.objects.create(sett_type_id='O', sett_num='2014232')