Django REST Framework API:无法获取字段的字符串值 [英] Django REST Framework API: Unable to Get String Value of a Field

查看:44
本文介绍了Django REST Framework API:无法获取字段的字符串值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Django的初学者。现在,我正在使用API​​。我面临一个问题。我无法在

I am a beginner in Django. Right now, I am working with the APIs. I am facing a problem. I can't view the string value one of the fields, called label, at http://127.0.0.1:8000/gameapi/. Instead of seeing "label_tag": "racing", I am seeing "label_tag": [2]. Here is the screenshot:

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

Here are my codes of serializers.py located inside gamreview folder.

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 的代码:

Here are my codes of models.py under gamreview folder:

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

这是我的 views.py gamreview 文件夹下的c $ c>:

Here are my codes of views.py under gamreview folder:

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 的代码文件夹:

Here are my codes of urls.py under gamreview folder:

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()),


]

在运行服务器。但是,没有显示 label_tag:赛车
如何解决该问题?

I don't get any error while running the server. However, "label_tag": "racing"is not showing up. How can I fix the issue?

推荐答案

在游戏模型中将label_tag更改为

in Game model change label_tag to

label_tag = models.ManyToManyField(Tags, related_name='tags')

这可以视为标记,是游戏模型
的字段,您的序列化器类应为

this can be considered as tags is a field for a Game model your serializer classes should be

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

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

您将获得标签,作为标签对象的列表,每个标签都有一个带有字符串值的标签字段

you will get tags as a list of tags objects every tag have a label field with string value

'tags': [
    {
        'label': 'etc'
    },
    {
        'label': 'etc2'
    }
]

'tags': [
    'etc',
    'etc'
]

this code will help you 
```python
class GameSerializer(serializers.ModelSerializer):
    label_tags = serializers.SerializerMethodField()
    class Meta:
        model = Game
        # fields = ['id', 'title', 'developer', 'platform']
        fields = ['id', 'title', 'developer', 'platform','label_tags']

    def get_label_tags(self, game):
        new_tags = []
        tags = game.label_tag.all()
        for tag in tags:
            new_tags.append(tag.label)
        return new_tags

这篇关于Django REST Framework API:无法获取字段的字符串值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆