2011-03-16 62 views
0

我创建了这个简单的项目来说明我的问题。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" 
    } 
] 

我失去了讲方法的结果,但获得了关系id和_state对象。任何人都可以解释为什么发生这种情况,我怎么能够防止它?这只是一个测试项目,我不想让任何人试图解释我的真实项目。

回答

1

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

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

+0

问题是我依赖于真实代码中的抽象模型。模型类型受到url的影响。例如/api/animals.cat/1或/api/animals.zoo/1 etc .... – Pickels 2011-03-16 10:51:11

+0

然后,您将需要为每个具体模型定义一个处理程序,不幸的是。您应该可以定义一次,然后为每个模型进行子类化。 – 2011-03-16 17:53:21

+0

废话,非常感谢您花时间回答我的问题。 – Pickels 2011-03-16 18:30:48