Django-piston:返回查询集和列表之间的区别?

时间:2011-03-16 10:11:26

标签: python django 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 个答案:

答案 0 :(得分:1)

因为您实际上并不是序列化Zoo对象,而是Animal对象。活塞看到你有一个动物的查询集,并试图找到一个动物处理程序 - 没有找到它,它只是序列化所有内置对象,而不是自定义方法。

定义一个AnimalHandler类并将fields元组移到那里,它应该可以工作。