我创建了这个简单的项目来说明我的问题。
这些是我的模特:
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对象。任何人都可以解释为什么会发生这种情况以及如何阻止它?这只是一个测试项目,我不想让任何人试图解释我的真实项目。
答案 0 :(得分:1)
因为您实际上并不是序列化Zoo对象,而是Animal对象。活塞看到你有一个动物的查询集,并试图找到一个动物处理程序 - 没有找到它,它只是序列化所有内置对象,而不是自定义方法。
定义一个AnimalHandler
类并将fields
元组移到那里,它应该可以工作。