2011-03-16 73 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

相關問題