如何在 JSON 中获取 PrimaryKeyRelatedField 的字符串表示形式
How to get string representation of PrimaryKeyRelatedField in JSON
我正在使用 Django REST Framework 并且我对这个东西还是个新手。
我想在我的 JSON 输出中使用 manytomanyfield 和 foreignkey 字段的字符串表示,而不是值。
models.py
class Movie(models.Model):
"""Movie objects"""
name = models.CharField(max_length=128)
directorName = models.ForeignKey(Director)
genre = models.ManyToManyField(Genre)
serializers.py
class MovieSerializer(serializers.ModelSerializer):
"""
Serialiazing all the Movies.
"""
genre = serializers.PrimaryKeyRelatedField(many=True, queryset=Genre.objects.all())
directorName = serializers.PrimaryKeyRelatedField(queryset=Director.objects.all())
owner = serializers.ReadOnlyField(source='owner.username')
class Meta:
model = Movie
fields = ('popularity',"directorName",'genre','imdbScore','name','owner')
JSON输出
{"popularity":"90.0","directorName":1,"genre":[1,2,3],"imdbScore":"8.9","name":"Titanic"}
而不是 directorName 和 genre 的 display_name,我只得到值。
请建议我如何更正此问题。
编辑
[已解决]
您需要重写 PrimaryKeyRelatedField 的 to_representation() 方法,因为它 returns pk.
为此,您需要覆盖 PrimaryKeyRelatedField
的 to_representation()
方法,因为它 return 是 pk
。
您可以创建一个继承自 PrimaryKeyRelatedField
的 MyPrimaryKeyRelatedField
,然后覆盖其 to_representation()
方法。
而不是 PrimaryKeyRelatedField
returned 的 value.pk
,return 现在是字符串表示。我使用 six.text_type()
而不是 str()
来处理 Python 2(unicode) 和 Python 3(str) 版本。
from django.utils import six
from rest_framework import serializers
class MyPrimaryKeyRelatedField(serializers.PrimaryKeyRelatedField):
def to_representation(self, value):
return six.text_type(value) # returns the string(Python3)/ unicode(Python2) representation now instead of pk
您的 serializers.py
将如下所示:
class MovieSerializer(serializers.ModelSerializer):
"""
Serialiazing all the Movies.
"""
genre = MyPrimaryKeyRelatedField(many=True, queryset=Genre.objects.all())
directorName = MyPrimaryKeyRelatedField(queryset=Director.objects.all())
owner = serializers.ReadOnlyField(source='owner.username')
class Meta:
model = Movie
fields = ('popularity',"directorName",'genre','imdbScore','name','owner')
最简单的大概就是用StringRelatedField
class MovieSerializer(serializers.ModelSerializer):
directorName = serializers.StringRelatedField(many=True)
class Director(Model):
# [...]
def __unicode__(self):
return self.directorName
但是,当您需要 Director
模型的不同表示时,这不起作用。在这种情况下,您需要使用自定义序列化程序(请参阅 Rahul Gupta 的回答)。
我正在使用 Django REST Framework 并且我对这个东西还是个新手。
我想在我的 JSON 输出中使用 manytomanyfield 和 foreignkey 字段的字符串表示,而不是值。
models.py
class Movie(models.Model):
"""Movie objects"""
name = models.CharField(max_length=128)
directorName = models.ForeignKey(Director)
genre = models.ManyToManyField(Genre)
serializers.py
class MovieSerializer(serializers.ModelSerializer):
"""
Serialiazing all the Movies.
"""
genre = serializers.PrimaryKeyRelatedField(many=True, queryset=Genre.objects.all())
directorName = serializers.PrimaryKeyRelatedField(queryset=Director.objects.all())
owner = serializers.ReadOnlyField(source='owner.username')
class Meta:
model = Movie
fields = ('popularity',"directorName",'genre','imdbScore','name','owner')
JSON输出
{"popularity":"90.0","directorName":1,"genre":[1,2,3],"imdbScore":"8.9","name":"Titanic"}
而不是 directorName 和 genre 的 display_name,我只得到值。
请建议我如何更正此问题。
编辑 [已解决] 您需要重写 PrimaryKeyRelatedField 的 to_representation() 方法,因为它 returns pk.
为此,您需要覆盖 PrimaryKeyRelatedField
的 to_representation()
方法,因为它 return 是 pk
。
您可以创建一个继承自 PrimaryKeyRelatedField
的 MyPrimaryKeyRelatedField
,然后覆盖其 to_representation()
方法。
而不是 PrimaryKeyRelatedField
returned 的 value.pk
,return 现在是字符串表示。我使用 six.text_type()
而不是 str()
来处理 Python 2(unicode) 和 Python 3(str) 版本。
from django.utils import six
from rest_framework import serializers
class MyPrimaryKeyRelatedField(serializers.PrimaryKeyRelatedField):
def to_representation(self, value):
return six.text_type(value) # returns the string(Python3)/ unicode(Python2) representation now instead of pk
您的 serializers.py
将如下所示:
class MovieSerializer(serializers.ModelSerializer):
"""
Serialiazing all the Movies.
"""
genre = MyPrimaryKeyRelatedField(many=True, queryset=Genre.objects.all())
directorName = MyPrimaryKeyRelatedField(queryset=Director.objects.all())
owner = serializers.ReadOnlyField(source='owner.username')
class Meta:
model = Movie
fields = ('popularity',"directorName",'genre','imdbScore','name','owner')
最简单的大概就是用StringRelatedField
class MovieSerializer(serializers.ModelSerializer):
directorName = serializers.StringRelatedField(many=True)
class Director(Model):
# [...]
def __unicode__(self):
return self.directorName
但是,当您需要 Director
模型的不同表示时,这不起作用。在这种情况下,您需要使用自定义序列化程序(请参阅 Rahul Gupta 的回答)。