1

我正在尝试返回一个对象,它的关系为 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,但这似乎有点杂乱无章。

感谢您的帮助!

4

3 回答 3

1

我真的不认为这有什么关系select_related()

当你这样做时,你plant = [plant] 把你QuerySet放在一个列表中,所以在 serializers/base.py 中,当它迭代列表时它会找到 aQuerySet而不是单个对象,这就是错误的原因'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.

不知道你问的是不是这个。

于 2013-08-14T05:43:51.150 回答
0

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

试试这个:

plant = Plant.objects.filter(slug=kwargs['slug']).select_related()
于 2013-08-13T19:48:31.463 回答
0

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

我的解决方案是:

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

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

希望它可以帮助别人!

于 2013-08-13T21:03:21.173 回答