2012-08-10 7 views
5

関連オブジェクトのフィールドをフィルタリングしようとすると、Tastypieはエラーを返します。たとえば、実行中関連オブジェクトのフィールドでフィルタを適用するにはどうすればよいですか?

curl -H "Accept: application/json" \ 
    "http://localhost:8080/wordgame/api/v1/rounds/?format=json&players__username=moe" 

返される「Lookupsは、「プレイヤー」フィールドに2レベル以上深くは許されません。基本的に、私は現在、Djangoのシェルで何ができるかをやろうとしています:

Round.objects.all().filter(players__username=moe.username) 

私は簡潔にするために簡略化以下のコードを、使用しています:

# wordgame/api.py which has tastypie resources 
class RoundResource(ModelResource): 
    players = fields.ManyToManyField(UserResource, 'players',full=True) 
    . . . 

    class Meta: 
     queryset = Round.objects.all() 
     resource_name = 'rounds' 
     filtering = { 
      'players': ALL, 
     } 

class UserResource(ModelResource): 
    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'players' 
     filtering = { 
      'username': ALL, 
     } 

# wordgame/models.py which has Django models 
class Round(models.Model): 
    players = models.ManyToManyField(User) 
    word = models.CharField(max_length=75) 
    . . . 

私が原因であると仮定していますUserResourceは 'username'フィールドにフィルタを定義しますが、これはうまくいくはずですが、そうではありません。私はRoundResourceのフィルタに "players__username"を追加しようとしましたが、これはうまくいきませんでした。

私は約basic filtering in the docsを読んで、GitHubのコードを見ましたが、これは何もないようです。私もadvanced filtering documentationを見て、それは私のユースケースに適合していないようです。私はGitHubのTastypieコードを見てきましたが、1)私がこれをやっているか、2)これを動作させるために何を上書きするかを理解するのに十分理解していません。

+0

'ManyToManyField'はタイプミスです。 [Tastypie docs](http://django-tastypie.readthedocs.org/en/latest/fields.html)は 'fields.ToManyField'として持っています – supervacuo

+0

@supervacuo ManyToManyはToManyFieldのサブクラスとして現在のバージョンでサポートされています。 GitHub [here](https://github.com/toastdriven/django-tastypie/blob/master/tastypie/fields.py#L768)で見つけることができます。 –

+0

ああ、十分です。 – supervacuo

答えて

11

どうやら、あなたはこのようなあなたのfiltering行に関係-またがる検索、特にホワイトリストに必要:少なくとも

class UserResource(ModelResource): 
    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'players' 
     filtering = { 
      'username': ALL_WITH_RELATIONS, 
     } 

、私はそれはそれを置くために適切な場所だと思いますrelevant docsは非常にスリムです。しかし、Tastypieチケット、suggests this should work

+0

ありがとう! RoundResourceクラスの 'ALL'から 'ALL_WITH_RELATIONS'に変更しました。私はユーザー名でラウンドをフィルタリングできるようになりました。もう少しdoc、あるいはもっと良い目(私の側で)は、これを拾ったでしょう。 –

関連する問題