1

私は自分の問題を説明するためにこの簡単なプロジェクトを作成しました。

これらは私のモデルです:

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オブジェクトを取得します。なぜこれが起こるのか、そしてどうすればそれを防ぐことができるのか誰かが説明できますか?これは、私の実際のプロジェクトを説明しようとする人を退屈させたくなかった単なるテストプロジェクトです。

4

1 に答える 1

2

これは、実際にはZooオブジェクトではなく、Animalオブジェクトをシリアル化するためです。Pistonは、Animalsのクエリセットがあることを確認し、Animalハンドラーを見つけようとします。1つは見つからず、すべての組み込みオブジェクトをシリアル化するだけで、カスタムメソッドはシリアル化しません。

AnimalHandlerクラスを定義し、fieldsタプルをそこに移動すると、機能するはずです。

于 2011-03-16T10:29:40.413 に答える