django-rest-framework:为什么我的 API 为我的 ENUMS 返回键而不是值?

问题描述 投票:0回答:1

我在第一次 API 开发中陷入了困境。我希望有人能告诉我我做错了什么。

这是我的models.py

from django.db import models

# Create your models here.

COUNTRY_LIST = [('PL', 'Poland'), ('DK', 'Denmark'), ('FI', 'Finland')]


class Trip(models.Model):

    startDate = models.DateField()
    endDate = models.DateField()
    country = models.ChoiceField(choices=COUNTRY_LIST, max_length=2)

这是我的serializers.py

from rest_framework import serializers
from trips.models import Trip, COUNTRY_LIST, CLIENTS_LIST, TRANSPORTS_LIST, STATUS_LIST

# Trip Serializer


class TripSerializer(serializers.ModelSerializer):
    class Meta:
        model = Trip
        fields = '__all__'

这是我的api_views.py

from rest_framework.exceptions import ValidationError
from rest_framework.generics import ListAPIView, CreateAPIView, RetrieveUpdateDestroyAPIView
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter
from trips.serializers import TripSerializer
from trips.models import Trip
import re

class TripList(ListAPIView):
    queryset = Trip.objects.all()
    serializer_class = TripSerializer
    filter_backends = (DjangoFilterBackend, SearchFilter)
    filter_fields = ('id', 'tripStatus', 'employeeId')
    search_fields = ('place', 'remarks')

这是我的urls.py

from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include

import trips.views
import trips.api_views

urlpatterns = [
    path('trip', trips.api_views.TripList.as_view()),

问题描述: 目前,按照上面的设计,我的 API 使用数据进行响应,其中返回我的枚举的密钥,如下所示:

{
    "id": 6,
    "startDate": "2019-11-04",
    "endDate": "2019-11-05",
    "country": "PL"
},

我想我需要在serializers.py中实现一些更改以使其做出这样的响应:

{
    "id": 6,
    "startDate": "2019-11-04",
    "endDate": "2019-11-05",
    "country": "Poland"
},

有人可以在这里给我一些建议吗?

python django rest django-models django-rest-framework
1个回答
3
投票

开始,您可以指定

source=...
参数并指定它应该使用该值的显示:

class TripSerializer(serializers.ModelSerializer):
    country = serializers.CharField(source='get_country_display')

    class Meta:
        model = Trip
        fields = '__all__'

所以这里我们不使用

country
值本身,而是使用
get_country_display

© www.soinside.com 2019 - 2024. All rights reserved.