【问题标题】:Django-piston: Difference between returning a queryset and a list?Django-piston:返回查询集和列表之间的区别?
【发布时间】:2011-03-16 10:11:26
【问题描述】:

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

这些是我的模型:

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 对象。谁能解释为什么会发生这种情况以及我如何防止它?这只是一个测试项目,我不想让任何人试图解释我的真实项目。

【问题讨论】:

    标签: python django django-piston


    【解决方案1】:

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

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

    【讨论】:

    • 问题是我在我的真实代码中依赖于一个抽象模型。模型类型是由 url 决定的。例如 /api/animals.cat/1 或 /api/animals.zoo/1 等......
    • 不幸的是,您需要为每个具体模型定义一个处理程序。您应该能够定义一次,然后为每个模型对其进行子类化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 2017-04-27
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    相关资源
    最近更新 更多