Python Django REST Framework API:无法获取字段的字符串值

Python Django REST Framework API:无法获取字段的字符串值,python,django,django-rest-framework,Python,Django,Django Rest Framework,我是Django的初学者。现在,我正在使用API。我面临一个问题。我无法查看位于的名为label的字段之一的字符串值。我看到的不是“标签”:“赛车”,而是“标签”:[2]。以下是截图: 这是我的serializers.py的代码,位于gamreview文件夹中 from rest_framework import serializers from .models import Game, Tags # class TagSerializer(serializers.ModelSeriali

我是Django的初学者。现在,我正在使用API。我面临一个问题。我无法查看位于的名为
label
的字段之一的字符串值。我看到的不是
“标签”:“赛车”
,而是
“标签”:[2]
。以下是截图:

这是我的
serializers.py的代码,位于gamreview文件夹中

from rest_framework import serializers
from .models import Game, Tags


# class TagSerializer(serializers.ModelSerializer):
#     class Meta:
#         model = Tags
#         fields = ['label']

class GameSerializer(serializers.ModelSerializer):
    # label_tag = TagSerializer(many=True)
    class Meta:
        model = Game
        # fields = ['id', 'title', 'developer', 'platform']
        fields = ['id', 'title', 'developer', 'platform','label_tag']

def create(self, validated_data):
    label_tag_data = validated_data.pop('label_tag')
    game = Game.objects.create(**validated_data)
    for tags_data in label_tag_data:
        Tags.objects.create(game=game, **tags_data)
    return Game.objects.create(**validated_data)

def update(self, instance, validated_data):
    instance.title = validated_data.get('title', instance.title)
    instance.developer = validated_data.get('developer', instance.developer)
    instance.platform = validated_data.get('platform', instance.platform)
    # instance.tag = TagSerializer(read_only=True, many=True)
    instance.save()
    return instance
以下是我在gamreview文件夹下的
models.py
代码:

from django.db import models
from django.template.defaultfilters import slugify

# Create your models here.

class Tags(models.Model):
    label = models.CharField(max_length=20)

    def __str__(self):
        return self.label


class Game(models.Model):
    title = models.CharField(max_length=100)
    developer = models.CharField(max_length=100)
    platform = models.CharField(max_length=50, default='null')
    label_tag = models.ManyToManyField(Tags)
    slug = models.SlugField(max_length=150, default='null')

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super().save(*args, **kwargs)


class Review(models.Model):
    game = models.ForeignKey(Game, on_delete=models.CASCADE)
    review = models.CharField(max_length=1000)
    date = models.DateField(auto_now=True)
    slug = models.SlugField(max_length=150, default='null')

    def __str__(self):
        return self.game
from django.views import generic
from .models import Game
from rest_framework import generics
from .serializers import GameSerializer


# Create your views here.


class GameListView(generic.ListView):
    template_name = 'gamereview/gamelist.html'
    context_object_name = 'all_games'

    def get_queryset(self):
        return Game.objects.all()


class ReviewView(generic.DetailView):
    model = Game
    template_name = 'gamereview/review.html'

# class GameApiView(generics.ListAPIView):
class GameApiView(generics.ListCreateAPIView):
    queryset = Game.objects.all()
    serializer_class = GameSerializer

class GameDetailApiView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Game.objects.all()
    serializer_class = GameSerializer
以下是我在gamreview文件夹下的
views.py
代码:

from django.db import models
from django.template.defaultfilters import slugify

# Create your models here.

class Tags(models.Model):
    label = models.CharField(max_length=20)

    def __str__(self):
        return self.label


class Game(models.Model):
    title = models.CharField(max_length=100)
    developer = models.CharField(max_length=100)
    platform = models.CharField(max_length=50, default='null')
    label_tag = models.ManyToManyField(Tags)
    slug = models.SlugField(max_length=150, default='null')

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super().save(*args, **kwargs)


class Review(models.Model):
    game = models.ForeignKey(Game, on_delete=models.CASCADE)
    review = models.CharField(max_length=1000)
    date = models.DateField(auto_now=True)
    slug = models.SlugField(max_length=150, default='null')

    def __str__(self):
        return self.game
from django.views import generic
from .models import Game
from rest_framework import generics
from .serializers import GameSerializer


# Create your views here.


class GameListView(generic.ListView):
    template_name = 'gamereview/gamelist.html'
    context_object_name = 'all_games'

    def get_queryset(self):
        return Game.objects.all()


class ReviewView(generic.DetailView):
    model = Game
    template_name = 'gamereview/review.html'

# class GameApiView(generics.ListAPIView):
class GameApiView(generics.ListCreateAPIView):
    queryset = Game.objects.all()
    serializer_class = GameSerializer

class GameDetailApiView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Game.objects.all()
    serializer_class = GameSerializer
以下是我在gamreview文件夹下的
urls.py
代码:

from . import views
from django.urls import path

app_name = 'gamereview'

urlpatterns = [
    path('gamereview/', views.GameListView.as_view(), name='gamelist'),
    path('gamereview/<slug:slug>/', views.ReviewView.as_view(), name='review'),
    path('gameapi/', views.GameApiView.as_view(), name='gamelistapi'),
    path('gameapi/<int:pk>/', views.GameDetailApiView.as_view()),


]
来自。导入视图
从django.url导入路径
应用程序名称='gamereview'
URL模式=[
路径('gamereview/',views.GameListView.as_view(),name='gamelist'),
路径('gamereview/',views.ReviewView.as_view(),name='review'),
路径('gameapi/',views.gameapieview.as_view(),name='gamelistapi'),
路径('gameapi/',views.gamedetailapiew.as_view()),
]
我在运行服务器时没有收到任何错误。但是,
“标签”:“赛车”
未显示。
如何解决此问题?

您可以使用源参数

 class GameSerializer(serializers.ModelSerializer):
        label_tag = serializers.ReadOnlyField(source='label.label')
        class Meta:
            model = Game
            fields = ['id', 'title', 'developer', 'platform','label_tag']
另一种方法是像这样使用SerializerMethodField(在这种情况下,我认为这是一种过度使用)


在游戏模型更改标签中检查类似的答案

label\u tag=models.ManyToManyField(标记,相关的\u name='Tags'))
这可以被视为标签是游戏模型的一个字段 序列化程序类应该是

类标记序列化程序(serializers.ModelSerializer):
类元:
模型=标签
字段=['label']
类GameSerializer(serializers.ModelSerializer):
tags=TagSerializer(many=True)
类元:
模型=游戏
#字段=['id'、'title'、'developer'、'platform']
字段=['id'、'title'、'developer'、'platform'、'tags']
您将获得标记作为标记对象的列表,每个标记都有一个带有字符串值的标签字段

“标签”:[
{
“标签”:“等”
},
{
“标签”:“etc2”
}
]
如果你想要像这样的标签

“标签”:[
“等等”,
“等”
]
此代码将帮助您
```蟒蛇
类GameSerializer(serializers.ModelSerializer):

label_tags=serializers.SerializerMethodField() 类元: 模型=游戏 #字段=['id'、'title'、'developer'、'platform'] 字段=['id'、'title'、'developer'、'platform'、'label_tags'] def获取标签标签标签(自我、游戏): 新标签=[] tags=game.label\u tag.all() 对于标记中的标记: 新标签追加(标签标签) 返回新的标签
当我使用源参数的代码时,
标签“:[2]
消失了。当我使用SerializerMethodField的代码时,我得到了一个错误:
AttributeError at/gameapi/“Game”对象没有属性“label”
use obj.label用于第二个代码第二个代码对我有效。然而,我并没有得到这样的输出:
'tags':['etc','etc']
相反,我得到这样的输出:
'label\u tags':['etc','etc']
我如何将'label\u tags'转换为'tags'?label\u tags=序列化程序。SerializerMethodField()>>tags=序列化程序。SerializerMethodField()和字段=['id','title','developer','platform','label_tags']>>字段=['id','title','developer','platform','tags']和def get_label_tags(自我,游戏):>>def get_tags(自我,游戏):