2 votes

comment obtenir toutes les valeurs d'un champ lié à clé primaire nested serializer django rest framework

Je possède les modèles suivants :

class SearchCity(models.Model):
    city = models.CharField(max_length=200)

class SearchNeighborhood(models.Model):
    city = models.ForeignKey(SearchCity, on_delete=models.CASCADE)
    neighborhood = models.CharField(max_length=200)

et ensuite le sérialiseur imbriqué suivant :

class CityNeighborhoodReadOnlySerializer(serializers.ModelSerializer):
    searchneighborhood_set = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = SearchCity
        fields = ('city','searchneighborhood_set')
        read_only_fields =('city', 'searchneighborhood_set')

associé à la vue :

class CityNeighborhoodView(ListAPIView):
    queryset = SearchCity.objects.all()
    serializer_class = CityNeighborhoodReadOnlySerializer

quand je fais l'appel api j'obtiens ceci :

city: "Chicago"
    searchneighborhood_set: 
      0: 5 
      1: 4
      2: 3
city: "New York"
    searchneighborhood_set:
      0: 8
      1: 7
      2: 6

J'obtiens juste les clés primaires des objets liés. Ce qui est bien, j'en ai besoin, mais je veux aussi les clés primaires des objets liés. neighborhood nom comment j'obtiens ça ?

éditer :

Cette question peut apporter un éclairage. Ils n'utilisent pas le sérialiseur lié à la clé primaire, donc ma question serait (si cela fonctionne bien sûr, quel est l'intérêt du sérialiseur lié à la clé primaire alors ?

Le sérialiseur imbriqué de Django Rest Framework n'affiche pas les données connexes

4voto

La réponse était de ne pas utiliser le primarykeyrelatedserializer mais plutôt le sérialiseur utilisé pour sérialiser Searchneighborhood objets.

J'ai changé ça :

class CityNeighborhoodReadOnlySerializer(serializers.ModelSerializer):
    searchneighborhood_set = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = SearchCity
        fields = ('city','searchneighborhood_set')
        read_only_fields =('city', 'searchneighborhood_set')

à ça :

class CityNeighborhoodReadOnlySerializer(serializers.ModelSerializer):
    searchneighborhood_set = SearchNeighborhoodSerializer(many=True, read_only=True)

    class Meta:
        model = SearchCity
        fields = ('city','searchneighborhood_set')
        read_only_fields =('city', 'searchneighborhood_set')

et est parti de cette sortie :

city: "Chicago"
    searchneighborhood_set: 
      0: 5 
      1: 4
      2: 3
city: "New York"
    searchneighborhood_set:
      0: 8
      1: 7
      2: 6

à celui que je voulais :

city: Chicago
    searchneighborhood_set:
         0: {pk: 5, neighborhood: 'River North}
    ....

mais maintenant une nouvelle question se pose, quel est l'intérêt d'un sérialiseur réalisé avec une clé primaire ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X