2012-08-10 2 views
5

관련 개체의 필드를 필터링하려고하면 Tastypie에서 오류를 반환합니다. 예를 들어,관련 개체의 필드를 필터링하려면 어떻게합니까?

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

반환 실행 "조회가 '선수'필드에 둘 이상의 수준 깊은 허용되지 않습니다." 기본적으로, 나는 장고 쉘에서 내가 현재 할 수있는 일을하려고 :

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)이 코드를 작동 시키려면 무엇을 재정의해야 하는지를 충분히 이해하지 못한다.

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

이 적어도, 나는 그것을 넣어 적절한 장소가 있다고 생각 :

+0

'ManyToManyField'가 오타라고 가정합니다. [Tastypie 문서] (http://django-tastypie.readthedocs.org/en/latest/fields.html)는'fields.ToManyField'로 가지고 있습니다. – supervacuo

+0

@supervacuo ManyToMany는 현재 버전에서 ToManyField의 서브 클래스로 지원됩니다. GitHub [여기] (https://github.com/toastdriven/django-tastypie/blob/master/tastypie/fields.py#L768)에서 찾을 수 있습니다. –

+0

아, 그 정도면 충분합니다. – supervacuo

답변

11

은 분명히,이 같은 특히 화이트리스트 당신의 filtering 라인의 관계를 확대하는 조회를 할 필요가있다. relevant docs은보기에 상당히 날씬합니다. 그래도 Tastypie 티켓, suggests this should work.

+0

감사! RoundResource 클래스의 'ALL'을 'ALL_WITH_RELATIONS'로 변경했습니다. 이제 사용자 이름별로 라운드를 필터링 할 수 있습니다. 조금 더 많은 의사 또는 더 나은 눈 (내 부분에), 이것에 주운 것입니다. –

관련 문제