Django admin:list_display / search_fields管理视图中外键的外键

时间:2016-09-29 21:13:06

标签: django django-admin

我对django程序员有一个问题应该很容易,但目前我无法弄清楚如何解决。

我有这三个模型(我尽可能地简化):

class Nations(models.Model):
    label = models.CharField(max_length=200)
    iso2 = models.CharField(max_length=2, unique=True)

class Cities(models.Model):
    label = models.CharField(max_length=200, null=True)
    country_code = models.ForeignKey(Nations, to_field='iso2', on_delete=models.SET_NULL, null=True, verbose_name='Nation')

class Person(models.Model):
    username = models.CharField(max_length=200, blank=False) 
    city = models.ForeignKey(Cities, on_delete=models.SET_NULL, null=True, blank=True)

如您所见,Person模型只与Cities模型相关联。我需要做的是设置PersonAdmin类,以便在admin视图中添加一个显示Nations.label值的列并使其可搜索。在下面的例子中,我调用了这个字段city__country_code__label,只是为了让你弄清楚我的意思(但当然它不起作用,因为Person模型中没有country_code对象)。

class PersonAdmin(admin.ModelAdmin):

  list_display = ('id', 'username', 'city', 'city__country_code__label')
  ordering = ('username',) 
  raw_id_fields = ('city',)
  search_fields = ['username', 'city__label', 'city__country_code__label']

[...]

我怎么能让Django这样做?

提前Thanx!

1 个答案:

答案 0 :(得分:2)

向模型管理员添加一个方法,该方法会将某人obj并返回国家/地区标签。然后将方法添加到list_display

class PersonAdmin(admin.ModelAdmin):
    def country_label(self, obj):
        return obj.city.country_code.label

    list_display = ('id', 'username', 'city', 'country_label')
    list_select_related = ['city__country_code']
    ordering = ('username',) 
    raw_id_fields = ('city',)
    search_fields = ['username', 'city__label', 'city__country_code__label']

有关详细信息,请参阅list_display文档。

注意我已使用list_select_related来减少SQL查询的数量。