Получение значений полей 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"
Ошибки:
django.core.exceptions.FieldError: Cannot resolve keyword 'value' into field. Join on 'service' not permitted.
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')])]