json - Django 将数据传递给 D3 - D3。eachFor 不是函数
问题描述
我有一个小项目,涵盖连接到 Django Webapp 的 Postgresql 数据库中的数据集合。我想使用 D3.js 可视化我的数据。我尝试调整两个 DateFields 从数据库中提取我的数据并将其作为 JSON 文件提供给 D3。
console.log 显示来自 JSON 的正确值,但我无法访问数据。显然,我的数据是作为字符串而不是 JSON 对象传递的。你知道为什么会这样吗?
我的看法:
from django.http import JsonResponse
from django.shortcuts import render
from django.core import serializers
from .models import Sonde
from .forms import date_choice
def index(request):
latest_Measurement = Sonde.objects.order_by('-Date')[:3]
form = date_choice
if request.method == 'POST':
form = date_choice(request.POST)
startDate = request.POST.get("start")
endDate = request.POST.get("end")
print(startDate)
subsetData = Sonde.objects.filter(Date__range=(startDate,endDate))
request.session['subsetData'] = serializers.serialize('json',subsetData)
else:
form = date_choice()
context = {
'latest_Measurement': latest_Measurement,
'form': form,
}
return render(request,'visDat/index.html',context)
def renderData(request):
subsetData = request.session.get('subsetData')
return JsonResponse(subsetData,safe=False)
我的网址:
from django.urls import path
from django.conf.urls import url
from . import views
#app_name = 'visDat'
urlpatterns = [
path('', views.index, name='index'),
url(r'^api/renderData',views.renderData, name='renderData'),
]
我的 index.html 模板:
<form action="" method="POST">
{% csrf_token %}
<table>
{{ form }}
</table>
<input type="submit" value="Submit" />
</form>
<script src="http://d3js.org/d3.v3.js"></script>
<script>
var margin = {top: 20, right: 20, bottom: 30, left: 50},
width = 960 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;
var parseDate = d3.time.format("%Y-%m-%dT00:00:00Z").parse; // for dates like "2014-01-01T00:00:00Z"
var x = d3.time.scale()
.range([0, width]);
var y = d3.scale.linear()
.range([height, 0]);
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom");
var yAxis = d3.svg.axis()
.scale(y)
.orient("left");
var line = d3.svg.line()
.x(function(d) { return x(d.Date); })
.y(function(d) { return y(d.Temperature); });
var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
d3.json("{% url "renderData" %}", function(error, data){
console.log(data);
data.forEach(function(d) {
d.Date = parseTime(d.Date);
d.Temperature =+ d.Temperature;
});
x.domain(d3.extent(data, function(d) { return d.Date; }));
y.domain(d3.extent(data, function(d) { return d.Temperature; }));
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
svg.append("g")
.attr("class", "y axis")
.call(yAxis);
svg.append("path")
.datum(data)
.attr("class", "line")
.attr("d", line);
});
</script>
如果我手动调用 renderData API,则会返回以下 JSON:
"[{\"model\": \"visDat.sonde\", \"pk\": 1, \"fields\": {\"Serial\": \"256599\", \"Date\": \"2018-06-26\", \"Temperature\": 12.56, \"Pressure\": 12.35}}, {\"model\": \"visDat.sonde\", \"pk\": 2, \"fields\": {\"Serial\": \"2565599\", \"Date\": \"2018-06-26\", \"Temperature\": 4.5, \"Pressure\": 100.3}}]"
当我运行脚本时,我得到了 eachFor 不是函数的 D3 错误。数据的类型是字符串而不是对象。但我通过 JsonResponse 处理它并将其序列化为来自 Django Query 的 JSON 对象。你知道如何解决这个问题吗?
解决方案
我的 JSON 返回没有返回 JSON,而是返回一个字符串。因此,我将其重新编码为 JSON:
import json as js
def renderData(request):
subsetData = request.session.get('subsetData')
return JsonResponse(js.loads(subsetData),safe=False)
推荐阅读
- webpack - VSCode 扩展从开发中运行,但在使用 webpack 打包时不起作用
- mysql - 更新特定数据库(Mysql)的每个表中特定列的所有行
- html - 当我减小屏幕尺寸时,如何均匀地修剪图像的左右两侧?(@媒体查询)
- python - discord.py:你能从他们的 id 中获取不在你的机器人服务器中的用户的名字吗?
- c# - 我如何获得完全像这样的菜单控制?
- c# - 尝试使用 TryValidateModel 验证控制器中的输入对象时单元测试失败
- yocto - 如何使用 Yocto 修改 rootfs 配置文件?
- node.js - SequelizeDatabaseError:列“functionCode”不存在,当它存在时
- javascript - 在 Vue.js 中更改 DIV 网格上的背景颜色而不更改其他人的背景
- dart - 如何在 Dart 构造函数中设置 final/const 属性