[英]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。
為此,您需要重寫PrimaryKeyRelatedField
的to_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.