[英]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.