2015-07-12 76 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

相關問題