Django:将带有相关对象的 QuerySet 转换为 JSON

Posted

技术标签:

【中文标题】Django:将带有相关对象的 QuerySet 转换为 JSON【英文标题】:Django: convert QuerySet with related objects to JSON 【发布时间】:2013-08-11 09:33:43 【问题描述】:

假设我有两个简单的模型:

class Place(models.Model):
    name = models.CharField(max_length=200)
    address = models.CharField(max_length=200)

class Event(models.Model):
    name = models.CharField(max_length=200)
    date = models.DateField()
    place = models.ForeignKey(Place)

我现在要做的是用已解决的位置查询一组事件,并将所有内容转换为字典列表,稍后可以将其转换为 JSON。

最终结果应该是这样的:

[
   "name": "event1",
   "date": "date1",
   "place": 
       "name": "place1",
       "address": "address1",
   ,
,
   "name": "event2",
   "date": "date2",
   "place": 
       "name": "place2",
       "address": "address2",
   ,
,]

到目前为止,我用ValueQuerySet.values() 方法试试运气:

Event.objects.all().select_related("place").values()

但是这不起作用,因为.values() 只返回相关对象的 id 而不是内容。所以我想知道是否有另一种内置方法来进行这种转换,或者我是否必须迭代 QuerySet 对象并自己进行转换。

【问题讨论】:

【参考方案1】:

有一个相关的方法叫model_to_dict

from django.forms.models import model_to_dict
model_to_dict(instance, fields=[], exclude=[])

但它不会从相关模型创建字典字段。

这是您可以使用的 sn-ps:

http://djangosnippets.org/snippets/2342/ http://djangosnippets.org/snippets/2670/

希望对您有所帮助。

【讨论】:

【参考方案2】:

没有默认的方法来创建您所追求的嵌套字典,但您可以选择相关项目的值:

# No need for select_related in this case
Event.objects.values('name', 'date', 'place__name', 'place__address')

[
   "name": "event1",
   "date": "date1",
   "place__name": "place1",
   "place__address": "address1",
,
   "name": "event2",
   "date": "date2",
   "place__name": "place2",
   "place__address": "address2",
]

如果绝对必要,您可以在 Python 中进行一些后处理来获得您想要的嵌套字典。

【讨论】:

这很完美,非常感谢。一个后续问题:假设事件模型与另一个模型“广告”具有一对多关系。因此,一个事件可以有多个与之相关的 Ad 实例。还有一种方法可以表达与.value() 的这种关系,所以我最终会在我的字典中得到一个列表? @basilikum 不,values() 将为每个唯一组合创建一个字典,因此如果一个事件与两个广告对象有关系,则该事件将被返回两次,每个广告对象一次。

以上是关于Django:将带有相关对象的 QuerySet 转换为 JSON的主要内容,如果未能解决你的问题,请参考以下文章

从 Django QuerySet 中获取所有相关的多对多对象

Django Queryset 过滤器检查相关对象是不是存在

获取 Django 对象并将其返回包装在 QuerySet 中的函数?

Django - 如何将 QuerySet 转换为 Q 对象?

带有Queryset的Django Form ChoiceField

通过特定的 ManyToMany 对象订购 Django QuerySet