繁体   English   中英

如何在 Django REST API 中使用 ForeignKey 解决来自 2 个模型的数据序列化问题

[英]How to solve in Django REST API the serializing of data from 2 models with ForeignKey

我想知道正确的方法是从与 ForeignKey 连接的 2 个模型中序列化 Django REST API 中的数据。
情况是:我有一个名为 NewUsers 的第一个表,其中包含用户注册,还有一个名为 Ticker 的第二个表,其中包含从外部 API 保存的数据。
目标是:创建第 3 个表,其中 2 个表的部分互连 - 一部分是用户登录,另一部分是选择一个加密对象。 然后,这个新表将通过 Django REST API 序列化程序显示。
问题是:这个新的第三张表没有显示用户选择的完整值列表。
我已经浏览了这里的文档https://books.agiliq.com/projects/django-admin-cookbook/en/latest/override_save.html和这里https://www.django-rest-framework.org/tutorial/ 1-序列化/但找不到完整的解决方案。 我错过了什么?

视图.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

模型.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,
    )

序列化程序.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')

Django REST API不完整响应

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

管理员.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
    

实际上,我的管理员使用完整的值正确显示了响应: 在此处输入图像描述 .

如何完成 Django REST API 中的序列化响应?

我认为您需要为外键字段设置序列化程序。

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

    class Meta:
        model = SectionWatchlist
        fields = ('id', 'tickerlist', 'author', 'crypto')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM