J'utilise Django REST Framework et je suis assez novice dans ce domaine.

Je veux avoir une représentation sous forme de chaîne pour les champs manytomanyfield et Foreignkey dans ma sortie JSON plutôt que la valeur.

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')

Sortie JSON

{"popularity":"90.0","directorName":1,"genre":[1,2,3],"imdbScore":"8.9","name":"Titanic"}

Au lieu de display_name de directorName et genre, je n'obtiens que les valeurs.

Veuillez me suggérer comment corriger cela.

MODIFIER [RÉSOLU] Vous devez remplacer la méthode to_representation () de PrimaryKeyRelatedField lorsqu'elle renvoie le pk.

2
Rohan 12 juil. 2015 à 10:24

2 réponses

Meilleure réponse

Pour ce faire, vous devez remplacer la to_representation() méthode de PrimaryKeyRelatedField lorsqu'elle renvoie pk.

Vous pouvez créer un MyPrimaryKeyRelatedField qui hérite de PrimaryKeyRelatedField puis remplacer sa méthode to_representation().

Au lieu de value.pk que PrimaryKeyRelatedField a renvoyé, retournez maintenant la représentation sous forme de chaîne. J'ai utilisé six.text_type() au lieu de str() pour gérer à la fois le Python Versions 2 (unicode) et 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 

Votre serializers.py ressemblerait alors à:

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')
5
Rahul Gupta 12 juil. 2015 à 18:38

Le plus simple est probablement d'utiliser StringRelatedField

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

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

Cependant, cela ne fonctionne pas lorsque vous avez besoin de différentes représentations du modèle Director. Dans ce cas, vous devez utiliser un sérialiseur personnalisé (voir la réponse de Rahul Gupta).

2
dhke 12 juil. 2015 à 08:06