StringRelatedField不起作用,如官方教程中所示

时间:2019-02-01 14:14:28

标签: python django django-rest-framework relational serializer

我经历了https://www.django-rest-framework.org/api-guide/relations/的“序列化器关系”,并遇到了StringRelatedField关系字段的一些问题。 因此,在该教程中,他们给出了models.py和serializers.py。我添加了views.py和urls.py。 我的views.py:

# views.py 
from django.shortcuts import render 
from music.models import Album, Track 
from music.serializers import AlbumSerializer  
from rest_framework import generics


    class AlbumList(generics.ListCreateAPIView):
        queryset = Album.objects.all()
        serializer_class = AlbumSerializer


    class AlbumDetail(generics.RetrieveUpdateDestroyAPIView):
        queryset = Album.objects.all()
        serializer_class = AlbumSerializer

我的urls.py:

# urls.py
from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from music import views

urlpatterns = [
    path('music/', views.AlbumList.as_view()),
    path('music/<int:pk>/', views.AlbumDetail.as_view(), name='track-detail'),
]

urlpatterns = format_suffix_patterns(urlpatterns)

使用python manage.py shell命令,我创建了一个相册和track对象,如下所示:

>>> from music.models import Album, Track
>>> from music.serializers import AlbumSerializer
>>> album = Album(album_name="Desert", artist="Beduin")
>>> album.save()
>>> track = Track(album=album, order=1, title="Finding Water", duration="2" )
>>> track.save()
>>> track = Track(album=album, order=2, title="My Camel", duration="2" )
>>> track.save()

但是当我运行服务器时,我得到了:

{
     ...
        "album_name": "Desert",
        "artist": "Beduin",
        "tracks": [
            "Track object (2)",
            "Track object (3)"
        ]
    ...
}

我认为StringRelatedField使用unicode方法来显示对象表示形式。但是在我的情况下,它说的是“轨道对象(2)”和“轨道对象(3)”,而不是轨道的编号和标题。 有人可以帮忙吗? 注意:我使用的models.py和serializers.py与本教程中的完全相同。

1 个答案:

答案 0 :(得分:1)

要解决此问题,您可以向模型中添加__str__方法,如下所示:

def __str__(self):
    return f'{self.number}: {self.title}'