Django-piston:返回查询集和列表的区别是什么?

1 投票
1 回答
1569 浏览
提问于 2025-04-16 13:48

我创建了这个简单的项目来说明我的问题。

这是我的模型:

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这个元组放到那里,这样就可以正常工作了。

撰写回答