【问题标题】:JSON data has concatenated field name into value field (Django)JSON数据已将字段名称连接到值字段(Django)
【发布时间】:2016-01-25 21:06:38
【问题描述】:

我正在尝试使用 JSON、Django 和 Ajax 返回一个字符串,但是由于某种原因,它们的查询集导致 JSON 也包含字段名称。例如,它不只返回字段的值,而是将 [{'field_name': value}] 作为整个字符串返回。在控制台中,它打印出: {'field_name': "[{'field_name': value}]"}

我写的代码是:

def drugsanddoses(request):
    drugIdentifier = request.POST.get('drugID')

    drug_group = Antiepileptics.objects.get(name=drugIdentifier)
    drug_name = RiskCalculator.objects.filter(drug_name=drug_group).values('drug_name')
    l_dose = RiskCalculator.objects.filter(drug_name=drug_group).values('l_dose')   
    h_dose = RiskCalculator.objects.filter(drug_name=drug_group).values('h_dose')   
    pubmed_id = RiskCalculator.objects.filter(drug_name=drug_group).values('pubmed_id') 
    updated = RiskCalculator.objects.filter(drug_name=drug_group).values('updated') 

    data = {}

    try:
        data['drug_name'] = str(drug_name)
        data['l_dose'] = str(l_dose)
        data['h_dose'] = str(h_dose)
        data['pubmed_id'] = str(pubmed_id)
        data['updated'] = str(updated)

    except:
        raise Http404

    print(data)

    return JsonResponse(data, safe=False)

【问题讨论】:

    标签: javascript json django


    【解决方案1】:

    这是预期的行为,因为您在查询的values() 上执行str(queryset)。 ORM 中的values 将返回一个字典列表。如果您只想要值,请执行以下操作:

    RiskCalculator.objects.filter(drug_name=drug_group) \
                          .values_list('drug_name', flat=True).distinct()
    

    valuesvalues_list 的 Django 文档。

    即使这样,对每个查询都执行str() 没有意义,您根本不需要str()。因为需要将整个python数据结构序列化成json。否则,您将很难将字符串转换为 javascript 中的值列表。

    【讨论】:

    • 好的,这行得通。但是我应该在哪里添加序列化呢?
    • JsonResponse 正在这样做,因此您无需额外工作。只需确保所有字段都是 json 可序列化的,即字符串、数字,但不是外键、多对多等对象。
    • 这很奇怪,因为我实现了以下内容:drug_name = RiskCalculator.objects.filter(drug_name=drug_group).values_list('drug_name', flat=True).distinct() data['drug_name'] = drug_name 我得到“TypeError: [1] is not JSON serializable”
    • 我在上一条评论中已经提到过,你应该确保结果是 json 可序列化的。请再读一遍,看看是否有意义。
    • 抱歉,我忘了说它们都是字符串或整数(在模型中它们是 IntegerFields 或 CharFields)
    猜你喜欢
    • 2020-07-16
    • 1970-01-01
    • 2017-01-15
    • 2019-04-12
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    相关资源
    最近更新 更多