2012-03-27 5 views
3

나는 다음과 같은 사용자 자원이 있습니다tastypie가있는 사용자 ID로 객체를 필터링하는 방법은 무엇입니까?

class UserResource(ModelResource): 
    class Meta: 
    queryset = User.objects.all() 
    resource_name = 'user' 
    fields = ['username', 'first_name', 'last_name'] 
    allowed_methods = ['get'] 
    filtering = { 
     'username': ALL, 
     'id': ALL, 
    } 

다음과 같은 모델 리소스 : 나는 사용자 ID보다는 사용자 이름은 골대를 필터링 할 수 있도록하려는

class GoalResource(ModelResource): 
    user = fields.ForeignKey(UserResource, 'user') 

    class Meta: 
    #authentication = BasicAuthentication() 
    #authorization = ReadOnlyAuthorization() 
    queryset = Goal.objects.all() 
    resource_name = 'goal' 
    filtering = { 
     'user': ALL_WITH_RELATIONS, 
    } 

합니다.

나는이에 GET 요청을 수행하여 특정 사용자 이름에서 목표의 목록을 얻을 수 있습니다

http://localhost:8000/api/v1/goal/?user__username=test 

을하지만 대신에 사용자 ID를 기준으로 정렬 할 수 있도록하려면 :

http://localhost:8000/api/v1/goal/?user__id=1 

방법 내가 두 번째 부분을 일하게 할까?

또한 Javascript를 통해 현재 로그인 한 사용자의 ID에 액세스하기위한 일반적인 절차는 무엇입니까? backbonejs를 사용하고 있으며 로그인 한 모든 사용자의 목표에 대해 게시물을 만들고 싶습니다. 사용자의 ID로 숨겨진 필드를 페이지에 두는 것에 대해 생각했습니다. 그런 다음 DOM에서 숨겨진 필드 값을 추출했지만 Chrome 개발자 도구를 사용하여 원할 때마다 ID를 쉽게 변경할 수 있다고 생각했습니다. 물론 인증 된 정보를 사용하여 로그인 한 사용자의 ID가 숨겨진 필드에서 추출한 ID와 일치하는지 확인합니다. 그러나 받아 들여진 방법은 무엇입니까?

+0

user_id로 정렬 또는 필터? – ashwoods

+0

사용자 필드에 id를 포함시키지 않으면 이상하게 보입니다. –

답변

4

내가 여기 제시 한 내용이 귀하의 승인에서 작동 할 수 있는지 확실하지 않습니다. 그것은 나를 위해 ApiKeyAuthorization 및 권한 부여를 사용하여 작동합니다. http://django-tastypie.readthedocs.org/en/latest/cookbook.html [섹션 : 만들기 사용자 별 자원]

나의 제안은 다음과 같습니다

나는의 생각을 읽을

무엇 주석을 인증 및 권한 부여 및 최우선 obj_create 및 apply_authorization에 대해. 나는 그것을 프로젝트에서 사용하고 있으며 작동한다. apply_authorization 메소드의 코드에서 수퍼 유저를 검사하는 if 조건을 추가 했으므로 수퍼 유저가 아닌지 확인하지 않고 object_list + 필터를 반환 할 수 있습니다. 수퍼 유저가 아닌 경우 사용자의 그룹과 관련된 데이터가 반환됩니다.

class GoalResource(ModelResource): 
    user = fields.ForeignKey(UserResource, 'user') 

    class Meta: 
    authentication = BasicAuthentication() 
    authorization = ReadOnlyAuthorization() 
    queryset = Goal.objects.all() 
    resource_name = 'goal' 
    filtering = { 
     'user': ALL_WITH_RELATIONS, 
    } 

    def obj_create(self, bundle, request=None, **kwargs): 
     return super(EnvironmentResource, self).obj_create(bundle, request, user=request.user) 


    def apply_authorization_limits(self, request, object_list): 
     if request.user.is_superuser: 
      return object_list.filter(user__id=request.GET.get('user__id','')) 

희망은 당신이 물어 본 것입니다. 그걸로 최고!

1

주 - apply_authorization_limits는 더 이상 사용되지 않습니다.

현재 사용자가 필터링하는 또 다른 방법은 권한 클래스의 read_list를 덮어 쓰는 것입니다. 이것이 내가 가진 것입니다. 내 클래스는 DjangoAuthorization보다 우선합니다.

def read_list(self, object_list, bundle): 
    klass = self.base_checks(bundle.request, object_list.model) 

    if klass is False: 
     return [] 

    # GET-style methods are always allowed. 

    # Filter by user 
    if not hasattr(bundle.request, 'user'): 
     return None 

    object_list = object_list.filter(user__id=bundle.request.user.id) 

    return object_list 
+0

와우는 실제로 사용되지 않으며 아직 문서의 모든 곳에서 사용됩니다. 도대체 뭐야? – kamelkev

+0

더 이상 사용되지 않는 것 같습니다. http://django-tastypie.readthedocs.org/en/latest/resources.html – eugene

+0

[소스] (https://github.com/django-tastypie/django-tastypie/blob/master)를 보면 더 이상 사용되지 않습니다. /tastypie/resources.py#L1079) – miraculixx

관련 문제