【问题标题】:Creating JSON data from Django model spanning foreign key从跨外键的 Django 模型创建 JSON 数据
【发布时间】:2018-07-03 01:25:59
【问题描述】:

我在我的 Django 2 模板中使用 D3 来创建绘图,但我不确定如何最好地创建一个包含来自父模型和子模型的数据的 JSON 对象。例如,这些是我的模型:

class Properties(models.Model):
  house_size     = models.IntegerField(blank=True, null=True)

class Prices(models.Model):
  price    = models.IntegerField(default=0)
  house    =models.ForeignKey(Properties,on_delete=models.CASCADE,default=0)

我知道要从价格创建 JSON 对象,我可以执行以下操作:

statdump = json.dumps(list(Prices.objects.all()), cls=DjangoJSONEncoder)

但是,如果我想创建一个包含 price 和 house_size 的 JSON 对象怎么办。

我可以想出一些低效的方法来解决这个问题,例如遍历模板中的观察结果并在那里创建 JSON 数据,但这似乎不是很有效。有没有办法可以从包含 house_size 和 price 的视图中传递 JSON 对象?

提前致谢

【问题讨论】:

    标签: json django


    【解决方案1】:

    尝试使用

    from django.db.models import F
    from django.core import serializers
    
    objectQuerySet =  Prices.objects.all().annotate(house_size = F('house__house_size'))
    statdump = serializers.serialize('json', objectQuerySet, fields=('price','house_size'))
    

    [编辑] 如果您想将其返回到模板,请尝试使用:

    from django.db.models import F
    from django.core import serializers
    from django.http import JsonResponse
    
    objectQuerySet =  Prices.objects.all().annotate(house_size = F('house__house_size')).values('price','house_size')
    return JsonResponse({'jsonObject'=list(objectQuerySet)},safe=False)
    

    【讨论】:

    • 这几乎可以工作,例如我可以运行: pricecomb = prices.objects.all().annotate(house_size = F('house__house_size')) print(pricecomb.values('house_size', 'price')) 并看到结果确实包含 house_size 字段。但是,当尝试运行 json.dumps 时,我会收到一个错误消息“‘价格’类型的对象不是 JSON 可序列化的”。我还需要在这里更改什么?我也尝试过: priceump = serializers.serialize("json", pricecomb) 确实有效,但是 JSON 对象中不存在 house_size 字段。再次感谢。
    • 对不起,我忘了查询集不能像那样序列化。如果您只想获取具有房屋大小和价格的 JSON 对象,可以尝试我编辑的答案。
    • 再次感谢。尽管如此,仍然有问题。您的代码确实创建了一个正确的查询集对象。我可以看到,如果我把它打印出来,它看起来像预期的那样,即它有 price 和 house_size。我也可以从视图中打印 JSON 对象,它仍然是正确的,但是当我在模板中使用 console.log 来写出它的内容时,我看到的是外键而不是房子的大小。我还缺少什么吗?
    • 如果您想将其返回到模板,请尝试编辑中的代码。
    猜你喜欢
    • 2015-05-20
    • 2023-03-08
    • 2021-10-30
    • 2020-09-23
    • 2011-05-10
    • 2017-03-08
    • 1970-01-01
    • 2023-01-02
    相关资源
    最近更新 更多