You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django的choices中获取分组名称?

获取Django嵌套Choices的分组名称

针对你用嵌套元组组织的MEDIA_CHOICES,可以通过遍历choices结构、匹配选中值的方式获取对应的分组名称,以下是具体实现方案:

方法一:模型内添加实例方法

直接在Student模型中定义方法,用于返回当前实例的media分组:

from django.db import models

class Student(models.Model):
    MEDIA_CHOICES = [
        ('Audio', (
                ('vinyl', 'Vinyl'),
                ('cd', 'CD'),
            )
        ),
        ('Video', (
                ('vhs', 'VHS Tape'),
                ('dvd', 'DVD'),
            )
        ),
        ('unknown', 'Unknown'),
    ]
    media = models.CharField(max_length=20, choices=MEDIA_CHOICES)

    def get_media_group(self):
        # 遍历所有choices项
        for item in self.MEDIA_CHOICES:
            # 判断当前项是否为分组(子元素是列表/元组)
            if isinstance(item[1], (list, tuple)):
                group_name, options = item
                # 遍历分组内的选项
                for opt_value, _ in options:
                    if opt_value == self.media:
                        return group_name
            else:
                # 处理无分组的选项(如unknown)
                opt_value, _ = item
                if opt_value == self.media:
                    return None  # 也可返回对应的标签'Unknown',按需调整
        # 未匹配到的情况返回None
        return None

在Admin界面展示分组名称

如果需要在Admin后台显示分组名,只需在StudentAdmin中配置list_display:

from django.contrib import admin
from .models import Student

class StudentAdmin(admin.ModelAdmin):
    list_display = ('media', 'get_media_group')
    # 给列设置友好显示名称
    get_media_group.short_description = '媒体分组'

admin.site.register(Student, StudentAdmin)

方法二:独立工具函数(复用场景)

如果需要在多个业务场景中复用该逻辑,可以抽成独立函数:

def get_media_group(value):
    from .models import Student
    for item in Student.MEDIA_CHOICES:
        if isinstance(item[1], (list, tuple)):
            group_name, options = item
            for opt_val, _ in options:
                if opt_val == value:
                    return group_name
        else:
            opt_val, _ = item
            if opt_val == value:
                return None
    return None

使用时直接调用:get_media_group('vinyl') 会返回'Audio'。

内容的提问来源于stack exchange,提问作者Florent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:21:29