0

relations emboîtéesdjango 1.11sérialiseur relations emboîtées ne fonctionnent pas comme il sholuld être

sérialiseur:

class PostDetailSerializer(ModelSerializer): 
    url = post_detail_url 
    user = UserSerializer(read_only=True) 
    image = SerializerMethodField() 
    html = SerializerMethodField() 
    tags = TagSerializer(many=True) 
    category = CategorySerializer() 
    source = SourceSerializer() 

    class Meta: 
     model = Post 
     fields = [ 
      'id', 
      'url', 
      'title', 
      'image', 
      'slug', 
      'content', 
      'source', 
      'source_link', 
      'category', 
      'tags', 
      'html', 
      'publish', 
      'timestamp', 
      'user', 
     ] 

Réponse:

HTTP 200 OK 
Allow: GET, HEAD, OPTIONS 
Content-Type: application/json 
Vary: Accept 

{ 
    "id": 3, 
    "url": "http://127.0.0.1:8000/api/v1/posts/new-postas/", 
    "title": "New Postaas", 
    "image": null, 
    "slug": "new-postas", 
    "content": "asssaasssasa", 
    "source": { 
    "id": 1, 
    "name": "prothom alo", 
    "slug": "prothom-alo" 
    }, 
    "source_link": "http://prothom-alo.com/", 
    "category": { 
     "id": 2, 
     "url": "http://127.0.0.1:8000/api/v1/posts/category/news/", 
     "name": "news" 
    }, 
    "tags": [ 
     { 
      "id": 1, 
      "name": "tech", 
      "slug": "tech" 
     } 
    ], 
    "html": "<p>asssaasssasa</p>\n", 
    "publish": "2017-08-31", 
    "timestamp": "2017-08-31T12:28:28.686538Z", 
    "user": { 
     "id": "ac32460f-fb7e-4755-9f7e-7c13085ee92b", 
     "email": "[email protected]", 
     "first_name": "Hasibul Amin", 
     "last_name": "Hemel" 
    } 
} 

Ceci est bien par rapport imbriqué récupération des données .

Mais encore une fois dans ma catégorie détails api sérialiseur ci-dessous:

class CategoryDetailSerializer(ModelSerializer): 
    url = category_detail_url 
    posts = PostDetailSerializer(many=True, read_only=True) 

    class Meta: 
     model = Category 
     fields = [ 
      'id', 
      'url', 
      'name', 
      'posts' 
     ] 

Voici mon sérialiseur post ne transmet aucune donnée dans l'api. Je ne sais pas. il n'y a pas de bug ou d'erreur, juste la valeur ne vient pas.

La catégorie Détails Réponse api:

HTTP 200 OK 
Allow: GET, HEAD, OPTIONS 
Content-Type: application/json 
Vary: Accept 

{ 
    "id": 2, 
    "url": "http://127.0.0.1:8000/api/v1/posts/category/news/", 
    "name": "news" 
} 

Here the Image

Y at-il une solution? J'ai cherché mais je n'en ai trouvé aucun.

Répondre

1

Puisque vous utilisez nomchamp posts en CategoryDetailSerializer vous devez définir related_name=posts à la catégorie relation à l'intérieur Post modèle:

class Post(Model): 
    category = ForeignKey(Category, related_name='posts') 

Ou vous pouvez utiliser le nom de relation par défaut post_set dans CategoryDetailSerializer:

class CategoryDetailSerializer(ModelSerializer): 
    url = category_detail_url 
    post_set = PostDetailSerializer(many=True, read_only=True) 

    class Meta: 
     model = Category 
     fields = [ 
     'id', 
     'url', 
     'name', 
     'post_set' 
     ] 

Voir détails here.

Vous pouvez également essayer de spécifier la source sur le champ sérialiseur utilisant related_name du modèle:

posts = PostDetailSerializer(many=True, read_only=True, source='cat_posts') 
+0

Bonjour, je mets cela sur le modèle .. 'category = models.ForeignKey (Catégorie, related_name = 'cat_posts', default = 1) tags = models.ManyToManyField (Tags, related_name = 'rel_posts', help_text =" Sélectionnez les tags pour cette évaluation ") ' pour la catégorie y et tags.devrais-je changer la catégorie 'related_name' à' posts'? mais pourquoi? ne devrait pas autre que 'posts' ne fonctionnera pas? Je ne comprends pas. Pouvez-vous s'il vous plaît décrire à ce sujet? Je vous remercie. – Hemel

+1

@Hemel des docs: 'Vous devez normalement vous assurer que vous avez défini un argument related_name approprié sur la relation, que vous pouvez utiliser comme nom de champ.' Donc, si vous avez un nom associé, vous devez également utiliser ce nom en sérialiseur. Ou vous pouvez essayer de définir la source sur le champ 'posts':' posts = PostDetailSerializer (many = True, read_only = True, source = 'cat_posts') '. – neverwalkaloner

+0

Et comment 'post_set' ne fonctionnera pas' posts'? si dans votre modèle d'exemple donné 'related_name' est' posts'? – Hemel

0

Je pense que le CategoryDetailSerializer() n'est pas appelé, Ce qui est appelé est l'autre sérialiseur de catégorie qui est le CategorySerializer().

+0

Je vérifie double à partir de l'URL qu'il s'appelle. 'url (r '^ catégorie/(P [\ w -]? +)/$', CategoryDetailAPIView.as_view(), name = 'catégorie détail'),' et le code de la vue. 'CategoryDetailAPIView classe (RetrieveAPIView): queryset = Category.objects.all() serializer_class = CategoryDetailSerializer lookup_field = 'Slug' permission_classes = [AllowAny]' @theShakelProgrammer – Hemel