在 django admin 中加入两个表以获取 display_list 的列

Posted

技术标签:

【中文标题】在 django admin 中加入两个表以获取 display_list 的列【英文标题】:join two tables in django admin to get columns for display_list 【发布时间】:2019-02-26 11:44:00 【问题描述】:

我在 django 管理界面的 list_display/joining 两个表时遇到问题。

我想要列 - SchPrograms 模型中的 program_nameis_active 以及 parameter_name, parameter_description >VisVisitParameters模型在django admin中。我能够在这些模型中的每一个中使用返回的那些列。我试图从已经被问到的question 那里寻求帮助。但我仍然无法弄清楚这一点。

class SchPrograms(models.Model):
  program_id = models.AutoField(primary_key=True)
  program_name = models.CharField(max_length=200, blank=True, null=True)
  creation_timestamp = models.DateTimeField(blank=True, null=True)
  is_active = models.IntegerField()

  class Meta:
      managed = True
      db_table = 'sch_programs'
      app_label = 'polls'

  def __str__(self):
      return self.program_name

class VisVisitParameters(models.Model):
   vparameter_id = models.AutoField(primary_key=True)
   parameter_name = models.CharField(max_length=300, blank=True, null=True)
   parameter_description = models.TextField(blank=True, null=True)
   is_active = models.IntegerField(choices=STATUS_CHOICES)

   class Meta:
       managed = False
       db_table = 'vis_visit_parameters'

   def __str__(self):
       return str(self.vparameter_id)
       app_label = 'polls'


class VisVisitParameterMappings(models.Model):
    vp_map_id = models.AutoField(primary_key=True)
    vparameter =  models.ForeignKey(VisVisitParameters,on_delete=models.CASCADE)
    program = models.ForeignKey(SchPrograms,on_delete=models.CASCADE)
    display_order = models.IntegerField(blank=True, null=True)
    is_active = models.IntegerField()

    class Meta:
       managed = False
       db_table = 'vis_visit_parameter_mappings'
       app_label = 'polls'

    def __str__(self):
       return str(self.parameter_name)

model.py

class VisVisitParameterMappings_admin(admin.ModelAdmin):
    list_display =   ('program_name','is_active','parameter_name','parameter_description ')

【问题讨论】:

【参考方案1】:

要在列表显示页面上显示所需的项目,您可以编写自定义方法,如文档 here 所述。

例如,对于名为 program_name 的字段,您可以:

def program_name(self, obj):
    if obj.program:
        return obj.program.program_name

program_name.short_description = 'Program name'

对于另一个名为 parameter_name 的模型字段,您可能有:

def parameter_name(self, obj):
    if obj.vparameter:
        return obj.vparameter.parameter_name

parameter_name.short_description = 'Parameter Name'

希望对你有帮助。

【讨论】:

某种原因,没有得到 parameter_name 的任何值,它是空白的。我会查一下。但一个后续问题。如果我需要从一个模型中获取超过 1 列,我需要做什么。例如,我想拥有名为“is_active”的列和“program_name”?如果你能指导一下,那将是有帮助的。 如果您想要其他列,例如 is_active,您也可以为其编写方法。这就是它的记录方式.. :)

以上是关于在 django admin 中加入两个表以获取 display_list 的列的主要内容,如果未能解决你的问题,请参考以下文章

Django实现自定义template页面并在admin site的app模块中加入自定义跳转链接

Django实现自定义template页面并在admin site的app模块中加入自定义跳转链接

如何在 MySQL/MariaDB 中加入两个巨大的表?

在 Django 过滤器中加入两个模型

在 Django 中加入两个查询集

django admin页面样式丢失问题