在Django Admin中按相关字段搜索

25 投票
1 回答
20090 浏览
提问于 2025-04-18 12:05

我在查看Django管理后台的文档,想要让它能够搜索相关字段。

这是我一些模型的代码。

# models.py
class Team(models.Model):
    name = models.CharField(max_length=255)


class AgeGroup(models.Model):
    group = models.CharField(max_length=255)


class Runner(models.Model):
    """
    Model for the runner holding a course record.
    """
    name = models.CharField(max_length=100)
    agegroup = models.ForeignKey(AgeGroup)
    team = models.ForeignKey(Team, blank=True, null=True)


class Result(models.Model):
    """
    Model for the results of records.
    """
    runner = models.ForeignKey(Runner)
    year = models.IntegerField(_("Year"))
    time = models.CharField(_("Time"), max_length=8)


class YearRecord(models.Model):
    """
    Model for storing the course records of a year.
    """
    result = models.ForeignKey(Result)
    year = models.IntegerField()

我希望在YearRecord的管理界面中,可以搜索到某个跑步者所属的团队。不过,当我尝试把Runner这个外键关系添加到搜索字段时,就会出现错误;错误信息是TypeError: Related Field got invalid lookup: icontains

这是我设置的管理界面,我希望能够通过这些关系进行搜索。我相信这和文档中的内容是匹配的,但我是不是哪里理解错了?这个问题能解决吗?能不能把result__runner扩展到Runner模型的团队字段上?

# admin.py
class YearRecordAdmin(admin.ModelAdmin):
    model = YearRecord
    list_display = ('result', 'get_agegroup', 'get_team', 'year')
    search_fields = ['result__runner', 'year']

    def get_team(self, obj):
        return obj.result.runner.team
    get_team.short_description = _("Team")

    def get_agegroup(self, obj):
        return obj.result.runner.agegroup
    get_agegroup.short_description = _("Age group")

1 个回答

36

文档上写着:

这些字段应该是某种文本字段,比如 CharFieldTextField

所以你应该使用 'result__runner__team__name'

撰写回答