【问题标题】:Django many to many field, but display just the highest valueDjango多对多字段,但只显示最高值
【发布时间】:2021-04-26 11:40:27
【问题描述】:

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

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', )

【问题讨论】:

标签: python django django-models django-admin


【解决方案1】:

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

您可以使用@admin.display 装饰器(请参阅Django docs)。 您还应该修改 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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 2012-03-29
    相关资源
    最近更新 更多