首页 > 解决方案 > Django多对多字段,但只显示最高值

问题描述

我想知道如何在员工中显示模范教育的最高排名。用户将能够选择他们所有的教育,但对我来说,当他/她也拥有硕士学位时,知道用户是否选择了“高中”是无关紧要的。

class Staff(models.Model):
    education = models.ManyToManyField('Education', verbose_name = 'Education')
class Education(models.Model):
    name = models.CharField(max_length = 200, blank = False)
    rank = models.PositiveIntegerField(default = 0)

    def __str__(self):
        return self.name

我给每一种教育都打了一个排名。

所以在 Admin 中,我唯一想要返回的是员工的最高学历——我该如何编写这个函数?

class StaffAdmin(admin.ModelAdmin):
    list_display = ('rank', )

标签: pythondjangodjango-modelsdjango-admin

解决方案


注意:此代码未经测试,只是为了向您展示可能的解决方案。

您可以使用@admin.display装饰器(请参阅Django 文档)。您还应该修改get_queryset()方法,以便检索所有 Staff 对象的排名,并且不会为每一行都命中数据库。所以你的代码看起来像这样

class StaffAdmin(admin.ModelAdmin):
    list_display = ('highest_rank', )
    
    @admin.display(description="Employee's highest education rank")
    def highest_rank(obj):
       top_rank = obj.Education.order_by("-rank").first()  # may return None
       return rank.name

    def get_queryset(self, request):
        qs = super(StaffAdmin, self).get_queryset(request)
        # get related model so we don't hit database for every Staff row
        return qs.prefetch_related("Education")

推荐阅读