如何在JSON中获取PrimaryKeyRelatedField的字符串表示形式

时间:2015-07-12 07:24:47

标签: python json django python-2.7 django-rest-framework

我正在使用Django REST框架,而且我对这件事情相当新手。

我想在我的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"}

而不是导演名称和类型的display_name,我只获取值。

请建议我如何纠正这个问题。

修改 [解决] 您需要覆盖PrimaryKeyRelatedField的to_representation()方法,因为它返回pk。

2 个答案:

答案 0 :(得分:4)

要做到这一点,您需要覆盖to_representation() PrimaryKeyRelatedField方法,因为它返回pk

您可以创建一个继承自MyPrimaryKeyRelatedField的{​​{1}},然后覆盖其PrimaryKeyRelatedField方法。

而不是to_representation()返回的value.pk,而是现在返回字符串表示。我使用six.text_type()而不是PrimaryKeyRelatedField来处理Python 2(unicode)和Python 3(str)版本。

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

答案 1 :(得分:2)

最简单的可能是使用StringRelatedField

class MovieSerializer(serializers.ModelSerializer):
    directorName = serializers.StringRelatedField(many=True)

class Director(Model):
    # [...]
    def __unicode__(self):
        return self.directorName

但是,当您需要Director模型的不同表示时,这不起作用。在这种情况下,您需要使用自定义序列化程序(请参阅Rahul Gupta的回答)。