Django-piston:返回查询集和列表的区别是什么?
我创建了这个简单的项目来说明我的问题。
这是我的模型:
class Zoo(models.Model):
name = models.CharField(max_length=30)
class Animal(models.Model):
name = models.CharField(max_length=30)
zoo = models.ForeignKey(Zoo)
def speak(zelf):
return 'woof woof'
这是我的基础处理器:
class ZooHandler(BaseHandler):
fields = ('id', 'name', 'speak')
def read(self, request):
z = Zoo.objects.get(pk=1)
qs = z.animal_set.all()
return qs
如果我不把查询结果转换成列表,结果是这样的:
[
{
"id": 1,
"name": "Tiger",
"speak": "woof woof"
},
{
"id": 2,
"name": "Panda",
"speak": "woof woof"
},
{
"id": 3,
"name": "Bear",
"speak": "woof woof"
},
{
"id": 4,
"name": "Parrot",
"speak": "woof woof"
},
{
"id": 5,
"name": "Dolphin",
"speak": "woof woof"
}
]
如果我把它转换成列表 return list(qs)
,会发生这样的事情:
[
{
"zoo_id": 1,
"_state": "<django.db.models.base.ModelState object at 0x2413f90>",
"id": 1,
"name": "Tiger"
},
{
"zoo_id": 1,
"_state": "<django.db.models.base.ModelState object at 0x241d590>",
"id": 2,
"name": "Panda"
},
{
"zoo_id": 1,
"_state": "<django.db.models.base.ModelState object at 0x241d6d0>",
"id": 3,
"name": "Bear"
},
{
"zoo_id": 1,
"_state": "<django.db.models.base.ModelState object at 0x241d750>",
"id": 4,
"name": "Parrot"
},
{
"zoo_id": 1,
"_state": "<django.db.models.base.ModelState object at 0x241d7d0>",
"id": 5,
"name": "Dolphin"
}
]
我失去了 speak 方法的结果,但得到了一个关联的 ID 和一个 _state 对象。有人能解释一下为什么会这样吗?我该怎么避免这种情况?这只是一个测试项目,我不想让大家觉得无聊,所以没详细讲我的真实项目。
1 个回答
2
因为你实际上并不是在处理Zoo对象,而是在处理Animal对象。Piston看到你有一组Animal对象,然后试图找到一个Animal的处理器,但没有找到,所以它就把所有内置的对象都处理了,而没有处理你自定义的方法。
你需要定义一个AnimalHandler
类,并把fields
这个元组放到那里,这样就可以正常工作了。