2013-04-15 2 views
0

에 request.user를 전달합니다. 내 모델의 사용자 정의 저장 메소드는 request.user를 인수로 사용하므로 POST/PUT 요청을 할 수 없습니다.Django-tastypie는 사용자 정의 저장 메소드

TypeError at /api/obsadmin/observation/23 
save() takes at least 2 arguments (1 given) 

저는 SessionAuthentication()을 사용하고 CSRF 토큰을 포함 시켰습니다.

def save(self, user, owner=None, *args, **kwargs): 
    self.updated_by = user.id 
    super(ObsModel, self).save(*args, **kwargs) 

그리고 자원 :

class ObservationResource2(ModelResource): 

comments = fields.ToManyField(CommentResource2, 'comments', full=True, null=True) 

class Meta: 
    queryset = Observation.objects.filter(is_verified=True) 
    authentication = SessionAuthentication() 
    authorization = DjangoAuthorization() 
    resource_name = 'observation' 
    always_return_data = True 

답변

2

당신은 당신의 ModelResource 서브 클래스의 기본 save() 메소드를 오버라이드 (override) 할 수

여기에 관련 모델 부분입니다. default implementation을 보면 save()이 요청과 저장할 개체가 모두있는 번들 개체와 함께 호출된다는 것을 알 수 있습니다.

Django 모델의 save() 서명을 변경하는 것이 매우 드문 경우이므로 불행히도 대부분의 코드를 복사하지 않으면 쉽게 변경할 수있는 방법이 없습니다.

from functools import partial 

try: 
    old_save = bundle.obj.save 
    bundle.obj.save = partial(old_save, user=bundle.request.user) 
    return super(FooResource, self).save(bundle) 
finally: 
    bundle.obj.save = old_save 

참조를 : 나는 조심스럽게 테스트하는 것이 좋습니다 것입니다하지만 당신은 같은 것을 할 수있을

5

저장하기 전에 데이터를 수정하기 위해 내장 된 hydrate 메서드를 사용하여이 같은 최종 목표를 달성했습니다. 현재 요청은 hydrate 메서드 내부의 bundle.request에서 사용할 수 있습니다. 문서 here을 참조하십시오.

Friend 모델은 FriendResource을 통해 노출되어 user ForeignKey 필드를 통해 장고 사용자를 생성하고 싶습니다.

내 예를 들어 자원 코드 :

class FriendResource(ModelResource): 
    class Meta: 
     queryset = Friend.objects.all() 
     resource_name = 'friend' 
     excludes = ['slug',] 
     authentication = SessionAuthentication() 
     authorization = DjangoAuthorization() 
     always_return_data = True 

    def get_object_list(self, request): 
     return super(FriendResource, self).get_object_list(request).filter(user=request.user) 

    def hydrate(self, bundle): 
     bundle.obj.user = bundle.request.user 
     return bundle 

희망하는 데 도움이!

+1

저는 더 이상 Tastypie를 사용하지 않지만 (DRF로 전환했습니다) 답변 해 주셔서 감사합니다. 나는 그것이 누군가에게 도움이 될 것이라고 확신한다. – ObviousCat

+0

정말 고마워요! 이 메커니즘은 다소 혼란스럽고 워드 프로세서는 부족합니다. 한 시간을 낭비했습니다. – roboslone

관련 문제