Задать вопрос
TheMaxai
@TheMaxai

Почему не получается привязать сериализатор к другому сериализатору?

Добрый день! :)
Моя задача - когда я буду делать запрос к api get_pages получить не только страницы, но и привязанные к ним текста. (я знаю что там нужно фильтровать по "texts_of_page", но мне бы хотя бы научится просто привязывать)
Делал по документации так, но поле texts не отображается

models.py
from django.db import models
from django.core.validators import FileExtensionValidator

# Create your models here.

class Page(models.Model):
    class Meta:
        db_table = "pages"
    title = models.CharField(max_length=200, default="Page with media")
    texts = ""
    def __str__(self):
        return self.title + " (%s)" % str(self.id)

class Text(models.Model):
    class Meta:
        db_table = "texts"
    text = models.TextField()
    counter_views = models.IntegerField(default=0, editable=False)
    texts_of_page = models.ForeignKey(Page, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)


serializers.py
from rest_framework import serializers
from main_page.models import Page, Text


class TextsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Text
        fields = '__all__'

class PagesSerializer(serializers.ModelSerializer):
    texts = TextsSerializer(many=True, read_only=True)
    class Meta:
        model = Page
        fields = ('id', 'title', 'texts',)


views.py
from django.shortcuts import render_to_response
from main_page.models import Page, Text, Audio, Video
from rest_framework import generics
from .serializers import PagesSerializer, TextsSerializer


class ListPagesView(generics.ListAPIView):
    queryset = Page.objects.all()
    serializer_class = PagesSerializer

class ListTextsView(generics.ListAPIView):
    queryset = Text.objects.all()
    serializer_class = TextsSerializer


urls.py
from django.urls import path, re_path, include

urlpatterns = [
    re_path('api/(?P<version>(v1|v2))/get_pages', include('main_page.views')[0].ListPagesView.as_view()),
    re_path('api/(?P<version>(v1|v2))/get_texts', include('main_page.views')[0].ListTextsView.as_view()),
]
  • Вопрос задан
  • 107 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
@IKMOL
Максим Вы не делали по документации, или делали то что Вам удобней :)
Связать сериалайзеры можно по первичном ключе. В модели он у вас указан. Но в сериалайзере Вы ссылаетесь на другое поле.

texts = TextsSerializer(many=True, read_only=True)
Так будет работать если поле первичного ключа равно назве поле сериалайзера.
У Вашем случае нужно дописать:
для 1 елемента:
texts = TextsSerializer(source='texts_of_page', read_only=True)

для нескольких в класс Text внести изменение:
texts_of_page = models.ForeignKey(Page, on_delete=models.CASCADE, related_name='texts')

в PagesSerializer переписать
texts = TextsSerializer(many=True, read_only=True)
если related_name иначе (как Я писал выше) нужно будет добавить параметр source='new_related_name'
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы