Django管理相关字段在另一个模型上

Django管理相关字段在另一个模型上,django,model,foreign-keys,Django,Model,Foreign Keys,以下是我的模型: class Location(models.Model): location_id = models.AutoField(primary_key=True) location = models.CharField(max_length=30, blank=False, null=False) class Host(models.Model): host_id = models.AutoField(primary_key=True) loca

以下是我的模型:

class Location(models.Model): 
    location_id = models.AutoField(primary_key=True)
    location = models.CharField(max_length=30, blank=False, null=False)

class Host(models.Model): 
    host_id = models.AutoField(primary_key=True)
    location = models.ForeignKey('Location', on_delete=models.PROTECT)
    host = models.CharField(max_length=30, blank=False, null=False)

class Device(models.Model):
    device_id = models.AutoField(primary_key=True)
    host = models.ForeignKey('Host', on_delete=models.PROTECT)
    model = models.ForeignKey('Model', on_delete=models.PROTECT)
    ip = models.GenericIPAddressField(null=True)
    name = models.CharField(max_length=30, blank=False, null=False)
下面是
DeviceAdmin
类:

class DeviceAdmin(admin.ModelAdmin):
    list_display=('host','name','model', 'ip')
    list_filter=(
        ('model', admin.RelatedOnlyFieldListFilter),
        ('host', admin.RelatedOnlyFieldListFilter),
    )    
admin.site.register(Device, DeviceAdmin)
我需要查看设备管理页面上的位置查找字段。但是,
位置
主机上的
设备
相关


如何在设备管理页面上显示
Location
字段以按位置->主机筛选设备类

您可以在
list\u过滤器中链接字段
,并在
list\u显示中使用ModelAdmin方法

class DeviceAdmin(admin.ModelAdmin):
    list_display = ('host', 'host_location', 'name', 'model', 'ip')
    list_filter = (
        ('model', admin.RelatedOnlyFieldListFilter),
        ('host', admin.RelatedOnlyFieldListFilter),
        'host__location',
    )

    def host_location(self, instance):
        return instance.host.location
    host_location.short_description = "Location"
    host_location.admin_order_field = 'host__location'
admin.site.register(Device, DeviceAdmin)

在评论中讨论后更新

要过滤外键(通过其任何字段,包括链接关系),您应该检查提供自动完成功能的工具。例如:。这将使您能够呈现此类小部件:

注意:自Django 2.0以来,它与“Django自动完成”灯的功能相同,而且代码更少


我犯了一个错误,你用我的最新版本测试了吗?如果是的话,你能提供更多关于错误的细节吗?是的,我已经测试过了。错误是:无法将关键字“位置”解析为字段。选项包括:设备id、主机、主机id……将需要完整的堆栈跟踪。看起来您有
list\u display=('host'、'location'、'name'、'model'、'ip')
,而不是
list\u display=('host'、'host\u location'、'name'、'model'、'ip')
啊,好的,您需要在更改表单中使用它吗?不在变更单上?对于这一点,我认为最好是依靠举例来说。这使您能够使用自动完成来呈现选择的小部件。因此,您可以键入一个位置的名称来筛选匹配的主机。以下是我的django项目中的一个示例: