class EmergencyAdmin(admin.ModelAdmin): list_display = ['NAME', 'name'] search_fields = ['NAME'] def NAME(self, obj): return obj.res_id.NAME为什么定义了NAME还是不能用NAME作为search_field作为筛选条件?
时间: 2024-03-27 21:35:47 浏览: 19
在 Django 中,使用 `search_fields` 属性来定义搜索字段,这个属性应该是一个列表,包含了模型中用于搜索的字段名。这些字段可以是模型中的任何字段,包括 ForeignKey 字段的字段。
在你的代码中,`search_fields` 属性定义了一个包含 `NAME` 的列表,但是在 `NAME` 方法中,你返回的是 `obj.res_id.NAME`,这个 `NAME` 字段不是模型中的字段,而是一个方法,所以不能被用作搜索字段。
要解决这个问题,你可以使用 `search_fields` 属性中的 `__` 符号来访问 `ForeignKey` 字段所关联的模型中的字段。例如,假设你有一个 `Emergency` 模型,它有一个 `res_id` 字段关联到 `Rescue` 模型,你可以使用以下方式定义 `search_fields` 和 `list_display` 属性:
```python
class EmergencyAdmin(admin.ModelAdmin):
list_display = ['name', 'rescue_name']
search_fields = ['name', 'res_id__name']
def rescue_name(self, obj):
return obj.res_id.name
rescue_name.short_description = 'Rescue Name'
```
在这个例子中,我们在 `search_fields` 中使用 `res_id__name` 来访问 `Emergency` 模型中 `res_id` 字段关联的 `Rescue` 模型中的 `name` 字段。在 `list_display` 中,我们使用 `rescue_name` 方法来显示 `Emergency` 模型中 `res_id` 字段关联的 `Rescue` 模型中的 `name` 字段。
注意,我们需要将 `rescue_name` 方法添加到 `list_display` 中,否则 Django Admin 将无法找到该方法并显示在 `Emergency` 列表中。我们还将 `rescue_name` 方法的 `short_description` 属性设置为 `'Rescue Name'`,这样就可以在 Django Admin 中正确地显示该列的标题了。