簡體   English   中英

如何在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和流派的display_name,我僅獲取值。

請建議我如何糾正此問題。

編輯 [已解決]您需要重寫PrimaryKeyRelatedField的to_representation()方法,因為它會返回pk。

為此,您需要重寫PrimaryKeyRelatedFieldto_representation()方法,因為它返回pk

您可以創建一個從PrimaryKeyRelatedField繼承的MyPrimaryKeyRelatedField ,然后重寫其to_representation()方法。

現在返回字符串表示形式,而不是PrimaryKeyRelatedField返回的value.pk 我已經使用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的回答)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM