Получение значений полей Enum из Django Queryset

У меня есть модель с колонкой enum, например

from django_enum_choices.fields import EnumChoiceField

class Service(Enum)
    MOBILE: "MOBILE"
    LAPTOP: "LAPTOP"


class Device(models.Model):
    service = EnumChoiceField(Service)
    ...

Можно ли получить результаты запроса, в котором перечисляемый столбец является значением перечисления?

Например: Если я сделаю:

query = Device.objects.values("service")
print(query)

Я получаю: <QuerySet [{'service': <Service.MOBILE: 'MOBILE'>}, {'service': <Service.MOBILE: 'MOBILE'>}, {'service': <Service.LAPTOP: 'LAPTOP'>}]>

Я желаю получить: <QuerySet [{'service': 'MOBILE'}, {'service': 'MOBILE'}, {'service': 'LAPTOP'}]>

Я получаю ошибки, когда запускаю: query = Device.objects.values("service__value") или query = Device.objects.values("service.value")

Я хочу что-то вроде того, как мы можем получить значение поля enum, сказав

mobile_service = Service.MOBILE # <Service.MOBILE: "MOBILE">
mobile_service_as_string = mobile_service.value # "MOBILE"

Ошибки:

  1. django.core.exceptions.FieldError: Cannot resolve keyword 'value' into field. Join on 'service' not permitted.
  2. django.core.exceptions.FieldError: Cannot resolve keyword 'service.value' into field. Choices are: service, ..

Оказывается, можно просто использовать сериализатор!

from django_enum_choices.serializers import EnumChoiceModelSerializerMixin
from rest_framework import serializer


class DeviceSerializer(EnumChoiceModelSerializerMixin, serializers.ModelSerializer):
    class Meta:
        model = Device
        fields = (
            "service",
        )

Результаты:

query = Device.objects.values("service").all()
results = DeviceSerializer(query, many=True)
print(results)

# [OrderedDict([('service', 'MOBILE')]), OrderedDict([('service', 'LAPTOP')])]
Вернуться на верх