Django将select_related()过滤器作为JSON返回

时间:2013-08-13 19:27:59

标签: django json

我正在尝试返回一个对象,它的关系为JSON。 如果我这样做,它的工作正常:

plant = Plant.objects.get(slug=kwargs['slug'])
return HttpResponse(serializers.serialize("json", [plant]), content_type='application/json')

但是当我尝试select_related()时,没有工作:

plant = Plant.objects.select_related().filter(slug=kwargs['slug'])
return HttpResponse(serializers.serialize("json", [plant]), content_type='application/json')

有没有办法让Django不再懒惰并构建对象? 我知道我可以继续渲染到模板,然后将输出显示为JSON,但这似乎有点像kludge。

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

我真的认为它与select_related()

无关

执行此操作plant = [plant] 你将QuerySet放在一个列表中,所以在serializers / base.py中,当它遍历列表时,它会找到QuerySet而不是单个对象,这就是错误'QuerySet' object has no attribute '_meta

但是对于案件

plant = Plant.objects.get(slug=kwargs['slug'])
return HttpResponse(serializers.serialize("json", [plant]), content_type='application/json')

在列表[plant]上进行迭代时,它会获得一个具有_meta.local_fields的对象,因此它适合您

我想如果你这样做会对你有用

plant = Plant.objects.select_related().filter(slug=kwargs['slug'])
return HttpResponse(serializers.serialize("json", plant), content_type='application/json')

我只是将QuerySet传递给序列化程序,而不是包含QuerySet的列表。

我不知道这是不是你要问的。

答案 1 :(得分:0)

那是因为你没有选择任何东西。

试试这个:

plant = Plant.objects.filter(slug=kwargs['slug']).select_related()

答案 2 :(得分:0)

好吧,我要回答我的问题。不知道它是否适用于所有情况。

我的解决方案是:

return HttpResponse(json.dumps(plant.get_fields()), content_type='application/json')

这是有效的,因为我已经定义了一个相当精细的get_fields()方法来处理OneToMany和ManyToMany关系的一些连接。

希望它可以帮助别人!