You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django从嵌套JSON数据中取值问题(Open FDA API场景)

在Django中处理Open FDA API的嵌套JSON数据

嘿,我完全懂你处理Open FDA API嵌套JSON时的取值烦恼——这种层级结构的数据刚开始确实容易踩坑,我来给你一步步拆解怎么在Django里轻松搞定它!

场景1:直接处理API返回的JSON响应

如果你是直接从Open FDA API请求数据,拿到响应后先转成Python字典,然后就可以通过键嵌套访问来获取数据了。这里推荐用get()方法代替直接用[]取值,能避免键不存在时抛出KeyError,更安全。

举个实际代码例子:

import requests
from django.shortcuts import render

def fetch_fda_report(request):
    # 替换成你的Open FDA API请求地址
    api_endpoint = "https://api.fda.gov/drug/event.json?limit=1"
    response = requests.get(api_endpoint)
    
    if response.status_code == 200:
        # 把JSON响应转成Python字典
        fda_report = response.json()["results"][0]  # 假设取第一个结果
        
        # 获取顶层字段
        seriousness_other = fda_report.get("seriousnessother")
        receipt_date = fda_report.get("receiptdate")
        
        # 获取嵌套在reportduplicate里的字段
        # 方式1:先判断父级键是否存在
        duplicate_info = fda_report.get("reportduplicate")
        if duplicate_info:
            duplicate_num = duplicate_info.get("duplicatenumb")
            duplicate_source = duplicate_info.get("duplicatesource")
        
        # 方式2:链式get(),更简洁,即使父级键不存在也不会报错
        duplicate_num_alt = fda_report.get("reportduplicate", {}).get("duplicatenumb")
        
        # 把数据传给模板或者后续逻辑
        context = {
            "seriousness_other": seriousness_other,
            "duplicate_num": duplicate_num,
            "duplicate_source": duplicate_source
        }
        return render(request, "fda_report.html", context)
    else:
        # 处理API请求失败的情况
        return render(request, "error.html", {"message": "Failed to fetch FDA data"})

场景2:从Django模型的JSONField中读取数据

如果你把API返回的JSON存在了Django模型的JSONField里,取值逻辑和处理普通字典几乎一致:

首先定义模型:

from django.db import models

class FDAReport(models.Model):
    report_data = models.JSONField()
    created_at = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return f"FDA Report {self.id}"

然后从模型实例中读取嵌套数据:

# 获取一个已存储的报告实例
report = FDAReport.objects.first()

# 顶层字段取值
safety_version = report.report_data.get("safetyreportversion")

# 嵌套字段取值
duplicate_source = report.report_data.get("reportduplicate", {}).get("duplicatesource")

在Django模板中展示嵌套JSON数据

如果要在模板里渲染这些数据,直接用点语法就可以访问字典的键,模板会自动处理层级:

<div class="fda-report">
    <p>Receipt Date: {{ report.report_data.receiptdate }}</p>
    <p>Safety Report Version: {{ report.report_data.safetyreportversion }}</p>
    
    {% if report.report_data.reportduplicate %}
        <div class="duplicate-info">
            <h4>Duplicate Details</h4>
            <p>Duplicate Number: {{ report.report_data.reportduplicate.duplicatenumb }}</p>
            <p>Source: {{ report.report_data.reportduplicate.duplicatesource }}</p>
        </div>
    {% endif %}
</div>

用{% if %}判断嵌套键是否存在,能避免页面显示空内容,体验更友好。

关键注意点

  • 始终优先用.get(key, 默认值)来取值,而不是直接dict[key],这样能避免因API返回数据缺失导致的报错;
  • 处理嵌套数据时,要么先检查父级键是否存在,要么用链式.get()(比如dict.get("parent_key", {}).get("child_key")),确保代码健壮性;
  • 如果Open FDA API返回的结构有变动,记得在代码里做容错处理,比如给get()设置合理的默认值。

内容的提问来源于stack exchange,提问作者Sapna Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:17:37