2015-07-12 71 views
2

我正在使用Django REST框架,并且我对这件事很相信新手。如何在JSON中获取PrimaryKeyRelatedField的字符串表示形式

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

代替DIRECTO的rName和流派的display_name,我只能得到这些值。

请教我如何解决这个问题。

EDIT [解决] 您需要重写PrimaryKeyRelatedField的to_representation()方法,因为它返回峰

回答

4

为此,您需要覆盖to_representation()方法PrimaryKeyRelatedField,因为它返回pk

您可以创建一个MyPrimaryKeyRelatedField,它继承自PrimaryKeyRelatedField,然后覆盖它的to_representation()方法。

而不是value.pk其中PrimaryKeyRelatedField返回,现在返回字符串表示形式。我已经使用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') 
+0

给我这个错误''Director'对象不可迭代' – Rohan

+0

你能发布回溯吗? –

+2

它解决了,实际上我为'directorName'设置了'many = True',这就是为什么它给了我'Director'对象不是可迭代的错误。但现在我得到这个东西,而不是'directorName'的字符串表示 - '“directorName”:“”,' – Rohan

1

最简单的可能是使用StringRelatedField

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

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

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

+0

但它给了我这个错误''关系字段不应该提供查询集参数',' – Rohan

+0

这是我的一个副本和过去的错误,'StringRelatedField'不需要/接受一个查询集。 – dhke

相关问题