Как решить в Django REST API проблему сериализации данных из двух моделей с помощью ForeignKey

Мне интересно, как правильно сериализовать данные в Django REST API из 2 моделей, связанных ForeignKey.
Ситуация такова: у меня есть 1-я таблица NewUsers с регистрациями пользователей, и 2-я таблица Ticker с данными, сохраненными из внешнего API.
. Цель состоит в том, чтобы: создать 3-ю таблицу с частями 2 таблиц, связанными между собой - одна часть это пользователь, вошедший в систему, а другая часть это выбор одного крипто-объекта. Эта новая таблица затем будет отображаться через сериализатор Django REST API.
Проблема в следующем: эта новая 3-я таблица не отображает полный список значений, выбранных пользователем.
Я просмотрел документацию здесь https://books.agiliq.com/projects/django-admin-cookbook/en/latest/override_save.html и здесь https://www.django-rest-framework.org/tutorial/1-serialization/, но не смог найти полного решения. Что я упускаю?

my views.py

from rest_framework import generics
from .serializers import WatchlistSerializer
from ticker.serializers import TickerSerializer
from watchlist.models import SectionWatchlist
from ticker.models import Ticker
import requests
from rest_framework.views import APIView
from rest_framework.decorators import api_view
from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
     
class CreateSectionWatchlist(generics.CreateAPIView):
    queryset = SectionWatchlist.objects.all()
    serializer_class = WatchlistSerializer

class ListSectionWatchlist(generics.ListAPIView):
    queryset = SectionWatchlist.objects.all()
    serializer_class = WatchlistSerializer
    
    def get_queryset(self):
        queryset = SectionWatchlist.objects.all()
        author = self.request.query_params.get('author')
        if author:
            queryset = queryset.filter(author=author)
        return queryset
    
class DeleteSectionWatchlist(generics.RetrieveDestroyAPIView):
    queryset = SectionWatchlist.objects.all()
    serializer_class = WatchlistSerializer

my models.py

from django.db import models
from django.conf import settings
from ticker.models import Ticker
    
class SectionWatchlist(models.Model):
    id = models.AutoField(primary_key=True)  # auto increment field
    tickerlist = models.ForeignKey(Ticker, related_name="tickerinfo", on_delete=models.CASCADE)
    crypto = models.CharField(blank=True, null=True, max_length=40)
    c_0 = models.FloatField(null=True, blank=True, default=None)
    o_0 = models.FloatField(null=True, blank=True, default=None)
    percentage = models.FloatField(null=True, blank=True, default=None)
    user_name = models.CharField(blank=True, null=True, max_length=40)
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL, blank=True, null=True,
        on_delete=models.CASCADE,
    )

my serializers.py

from rest_framework import serializers
from watchlist.models import SectionWatchlist
from ticker.models import Ticker
from ticker.serializers import TickerSerializer

class WatchlistSerializer(serializers.ModelSerializer):
    crypto = TickerSerializer()
    class Meta:
        model = SectionWatchlist
        fields = ('id','tickerlist','author', 'crypto')

API Django REST неполный ответ

{
        "id": 88,
        "tickerlist": 36,
        "author": 6,
        "crypto": {
            "crypto": null,
            "c_0": null,
            "o_0": null
        }
    }
]

my admin.py

from django.contrib import admin
from django import forms
from . import models
from ticker.models import Ticker

@admin.register(models.SectionWatchlist) 
class WatchlistAdmin(admin.ModelAdmin):
    list_display = (
                    'id', 
                    # 'percentage',
                    'tickerlist',
                    # 'user_name',
                    'author',
                    'get_crypto',
                    'get_c_0',
                    'get_o_0',
    )
    
    
    @admin.display(ordering='watchlist__tickerlist', description='get_crypto')
    def get_crypto(self, obj):
        return obj.tickerlist.crypto
    
    @admin.display(ordering='watchlist__tickerlist', description='c_0')
    def get_c_0(self, obj):
        return obj.tickerlist.c_0
    
    @admin.display(ordering='watchlist__tickerlist', description='o_0')
    def get_o_0(self, obj):
        return obj.tickerlist.o_0
    

На самом деле мой админ правильно отображает ответ с полными значениями: enter image description here.

Как получить сериализованный ответ в Django REST API?

Думаю, вам нужно установить сериализатор для полей внешнего ключа.

class WatchlistSerializer(serializers.ModelSerializer):
    tickerlist= TickerSerializer()
    author = UserSerializer()

    class Meta:
        model = SectionWatchlist
        fields = ('id', 'tickerlist', 'author', 'crypto')
Вернуться на верх