python - 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', )
解决方案
注意:此代码未经测试,只是为了向您展示可能的解决方案。
您可以使用@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")
推荐阅读
- sql - 为什么我们不能在子查询中使用/引用派生表
- mysql - 如何将我的 docker Django 实例连接到我的 docker mysql 实例?
- javascript - 谷歌地图 - 查询地理编码返回不正确的结果
- php - 将行设置添加到 WPBakery 插件
- android - Android:通过 NavGaphViewmodels 将 ViewmodelFactory 添加到 viewModel
- pandas - pyarrow 用可为空的 Integer 类型序列化 pandas df
- react-native - 加载 ANDROID_SDK_ROOT 以在 AndroidStudio 上启动 AVD 模拟器时出现问题
- pine-script - 如何对连续信号进行编号
- mysql - 从 MySQL 的列中删除一些字符
- python - Python:为什么 urllib.request.urlopen.read() 永远不会完成下载?