从Django Queryset中获取Enum字段的值



我有一个带有enum列的模型,例如

# Using Django 2.2 (does not support Enums natively)
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')])]