Как получить доступ к имени группы в Django choices?

Я использую структуру из нескольких кортежей для отображения вариантов выбора в разделе администратора, и я хотел бы получить доступ к первому элементу выбранного кортежа. В примере ниже, предполагая, что выбранный носитель vinyl, я хотел бы получить Audio. Как я могу это сделать?

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)

Насколько я знаю, функции для этого не существует, поэтому вам придется написать свою собственную:

from django.db import models
from operator import itemgetter


class Student(models.Model):

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

    @property
    def media_group(self):
        media = self.media
        return next(
            (
                g
                for g, vs in self.MEDIA_CHOICES
                if media in map(itemgetter(0), vs)
            ),
            None,
        )

Это вернет None в случае, если группа не может быть найдена, или если группа является None (см. изменения в MEDIA_CHOICES.

Вернуться на верх