5

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

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

「ルックアップは、「プレーヤー」フィールドで1レベル以上深くすることはできません。」を返します。基本的に、私は現在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」を追加しようとしましたが、これも機能しませんでした。

ドキュメントで基本的なフィルタリングについて読み、GitHubのコードを確認しましたが、これには何もありません。また、高度なフィルタリングドキュメントも確認しましたが、私のユースケースには合わないようです。GitHubでTastypieコードを見ましたが、1)これが間違っているのか、2)これを機能させるために何をオーバーライドするのかを理解するのに十分な理解がありません。

4

1 に答える 1

11

filteringどうやら、次のように、行内のリレーションにまたがるルックアップを具体的にホワイトリストに登録する必要があります。

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

少なくとも、それを置くのに適切な場所だと思います。関連するドキュメントは、例ではかなりスリムです。ただし、Tastypieチケットは、これが機能することを示しています。

于 2012-08-10T19:04:51.937 に答える