如何过滤相关对象中的字段?

时间:2012-08-10 15:55:05

标签: python django django-models tastypie

如果我尝试过滤相关对象中的字段,则Tastypie会返回错误。例如,运行

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

返回“在'玩家'字段中不允许超过一个级别的查找。”基本上,我正在努力做我目前在Django shell中所做的事情:

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'上定义了一个过滤器,它应该可以工作,但事实并非如此。我甚至尝试将“players__username”添加到RoundResource中的过滤器,但是这也不起作用。

我阅读了basic filtering in the docs并查看了GitHub上的代码,但似乎没有任何相关内容。我还看了advanced filtering documentation,它似乎不适合我的用例。我已经看过GitHub上的Tastypie代码,但是不明白它是否足以弄清楚1)我做错了什么,或者2)要覆盖什么来使其工作。

1 个答案:

答案 0 :(得分: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