Python Django REST Framework API:无法获取字段的字符串值
我是Django的初学者。现在,我正在使用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
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(自我,游戏):