我正在尝试返回一个对象,它的关系为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。
感谢您的帮助!
答案 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关系的一些连接。
希望它可以帮助别人!