使用 DRF 将摘要数据从 Django 提交到 React
Submitting SUMMARY Data from Django to React using DRF
我开始使用 Rest API 在 django 和 React 之间测试一些 API 数据。我可以在 Djnago 模型和 React 前端之间提交这些数据。
[
{
"id": 1,
"gender": "Male",
"age": 40,
"updated": "2022-04-25T18:55:23.304456Z",
"created": "2022-04-25T14:07:48.282139Z"
},
{
"id": 2,
"gender": "Male",
"age": 33,
"updated": "2022-04-25T18:55:23.304456Z",
"created": "2022-04-25T14:07:48.282139Z"
},
{
"id": 3,
"gender": "Female",
"age": 22,
"updated": "2022-04-25T18:55:23.304456Z",
"created": "2022-04-25T14:07:48.282139Z"
},
{
"id": 4,
"gender": "Female",
"age": 33,
"updated": "2022-04-25T18:55:23.304456Z",
"created": "2022-04-25T14:07:48.282139Z"
},
]
我的目标不是提交这个原始数据,而是提交计算男性和女性平均年龄的汇总数据(数据分析),所以我应该得到这样的结果:
[
{
"gender": "Male",
"average_age": 36.5,
},
{
"gender": "Male",
"average_age": 27.5,
}
]
在TestDrf.js
import React from "react"
import axios from 'axios'
export default function App() {
const [incomingData, setIncomingData] = React.useState([])
React.useEffect(function() {
console.log('effect ran')
axios.get('http://127.0.0.1:8000/test/')
.then(data => setIncomingData(data))
}, [])
return (
<div>
<pre>{JSON.stringify(incomingData.data, null, 2)}</pre>
</div>
)
}
在views.py
from rest_framework.response import Response
from rest_framework.decorators import api_view
from .models import Test
from .serializers import TestSerializer
@api_view(['GET'])
def getData(request):
test_data= Test.objects.all()
result = Test.objects.values('gender')
.annotate(average_age=Avg('age'))
serializer = TestSerializer(test_data, many=True)
return Response(serializer.data)
我应该在哪里制作这些交叉表?在后端还是前端?
如果在后端,我应该为汇总数据创建新模型吗?
我试着在网上寻找这方面的建议,但我很不走运!
可以在后台使用Django查询来执行aggregation;汇总数据不需要新模型。
从 'person' table 中按性别获取平均年龄的 SQL 查询将是这样的。
SELECT gender, AVG(age) AS average_age
FROM person
GROUP BY gender;
等效的 Django 查询与此类似。
from django.db.models import Avg
result = Person.objects.values('gender')
.annotate(average_age=Avg('age'))
更新:添加基于 class 的 API 视图
class GetData(APIView):
def get(self):
result = Test.objects.values('gender').annotate(average_age=Avg('age'))
response_data = {}
response_data['data'] = list(result)
return Response(response_data, status=status.HTTP_200_OK)
urls.py 应更新为使用此 API 视图。
path('getdata/', GetData.as_view()),
我开始使用 Rest API 在 django 和 React 之间测试一些 API 数据。我可以在 Djnago 模型和 React 前端之间提交这些数据。
[
{
"id": 1,
"gender": "Male",
"age": 40,
"updated": "2022-04-25T18:55:23.304456Z",
"created": "2022-04-25T14:07:48.282139Z"
},
{
"id": 2,
"gender": "Male",
"age": 33,
"updated": "2022-04-25T18:55:23.304456Z",
"created": "2022-04-25T14:07:48.282139Z"
},
{
"id": 3,
"gender": "Female",
"age": 22,
"updated": "2022-04-25T18:55:23.304456Z",
"created": "2022-04-25T14:07:48.282139Z"
},
{
"id": 4,
"gender": "Female",
"age": 33,
"updated": "2022-04-25T18:55:23.304456Z",
"created": "2022-04-25T14:07:48.282139Z"
},
]
我的目标不是提交这个原始数据,而是提交计算男性和女性平均年龄的汇总数据(数据分析),所以我应该得到这样的结果:
[
{
"gender": "Male",
"average_age": 36.5,
},
{
"gender": "Male",
"average_age": 27.5,
}
]
在TestDrf.js
import React from "react"
import axios from 'axios'
export default function App() {
const [incomingData, setIncomingData] = React.useState([])
React.useEffect(function() {
console.log('effect ran')
axios.get('http://127.0.0.1:8000/test/')
.then(data => setIncomingData(data))
}, [])
return (
<div>
<pre>{JSON.stringify(incomingData.data, null, 2)}</pre>
</div>
)
}
在views.py
from rest_framework.response import Response
from rest_framework.decorators import api_view
from .models import Test
from .serializers import TestSerializer
@api_view(['GET'])
def getData(request):
test_data= Test.objects.all()
result = Test.objects.values('gender')
.annotate(average_age=Avg('age'))
serializer = TestSerializer(test_data, many=True)
return Response(serializer.data)
我应该在哪里制作这些交叉表?在后端还是前端? 如果在后端,我应该为汇总数据创建新模型吗?
我试着在网上寻找这方面的建议,但我很不走运!
可以在后台使用Django查询来执行aggregation;汇总数据不需要新模型。
从 'person' table 中按性别获取平均年龄的 SQL 查询将是这样的。
SELECT gender, AVG(age) AS average_age
FROM person
GROUP BY gender;
等效的 Django 查询与此类似。
from django.db.models import Avg
result = Person.objects.values('gender')
.annotate(average_age=Avg('age'))
更新:添加基于 class 的 API 视图
class GetData(APIView):
def get(self):
result = Test.objects.values('gender').annotate(average_age=Avg('age'))
response_data = {}
response_data['data'] = list(result)
return Response(response_data, status=status.HTTP_200_OK)
urls.py 应更新为使用此 API 视图。
path('getdata/', GetData.as_view()),