2012-11-13 3 views
2

저는 며칠 동안 이것을보고 있었기 때문에 어떤 도움을받을 수 있도록 머리카락을 꺼내려고하고 있습니다. djangorestframework user_id가 null이 아닌 제약을 위반합니다.

내가 맵핑을 지정하려면 다음을 한 userFrom 및 userTo

class Package(models.Model): 

    title = models.CharField(max_length=50) 
    packageid = models.CharField(primary_key=True, max_length=64, default=uuid_str, editable=False) 
    userfrom = models.ForeignKey('auth.user', editable=False, related_name='userfrom') 
    userto = models.ForeignKey('auth.user', editable=False, related_name='userto') 

및 패키지에 대한 내 견해를 가지고 패키지라는 간단한 모델이

def pre_save(self, obj): 
    print "adding user to object! %s "%self.request.user 
    obj.userfrom = self.request.user 

Hoever는 '그 pre_save ISN 보인다 t 호출되고 userid의 매핑이 일어나지 않습니다. api로 로그인하고 새 패키지를 푸시하려고하면 오류가 발생합니다.

지도를 가능한 한 가깝게 매핑하려고 시도했습니다. http://django-rest-framework.org/tutorial/4-authentication-and-permissions.html 행운이 없습니다.

예외 유형 : IntegrityError 예외 값 : 열 "userfrom_id"에서
null 값은 내가 그 userfrom_id 및 userto_id 모두 null이 볼 수있는 SQL에 소스를 찾아-NOT NULL 제약을

을 위반하는 것입니다.

어떤 아이디어라도 높이 평가합니다.

J는

+0

'REST_FRAMEWORK'설정 사전에 어떤 내용이 있는지, 어떤 내용이 있는지 질문에 추가 할 수 있습니까? –

답변

3

저도 같은 문제를 가지고 : 넌이 같은 양식 뭔가가 필요 보기 클래스가 CreateModelMixin mixin을 상속하는지 확인하십시오. doc 상태로

:

가 pre_save() 메소드가 GenericAPIView 자체에 의해 호출되지 않는다는 것을 기억하지만,()가 CreateModelMixin 및 UpdateModelMixin 클래스의 메소드() 및 업데이트를 만들에 의해 호출됩니다.

+1

감사합니다! 나는이 물건이 전체의 시간에 마약 사용으로 돌아 오는 전화이었다고 생각했다. ... 고마워! –

3

당신이 pre_save을 정의하는 방법(), 그것은 그것은 모델 방법과 개체 패키지의 인스턴스가 저장 될 inteded 전에 rigth 실행해야 볼 수 없습니다. 무슨 일이 생기는지는 pre_save가 변수 "request"의 값을 알지 못한다는 것입니다. 왜냐하면 그 종류의 변수는 모델 환경이 아닌 뷰 기능 환경에 존재하기 때문입니다. 당신은 사물을 뒤섞고 있습니다.

# views.py 
def your_view(request): 

    if request.method == 'POST': 
     package_form = PackageForm(request.POST) 
     if package_form.is_valid(): 
      package = package_form.save(commit=False) 
      package.userfrom = request.user 
      package.save() 

      return render(request, 
       'your_template.html', {} 
      ) 
    package_form = PackageForm() 
    return render(request, 
       'another_template.html', {} 
      ) 

보기 다음과 같습니다

난 당신이 뭔가를 필요가 있다고 생각합니다.

def post(self, request, format=None): 
    serializer = SnippetSerializer(data=request.DATA) 
    if serializer.is_valid(): 
     self.pre_save(serializer.object) #pass in serializer.object 
     serializer.save() 
0

만들기 : 당신은 직렬화 된 객체와 게시물에 pre_save 전화를해야

...

class PackageForm(forms.ModelForm): 
    class Meta: 
     model = Package 
     exclude = ('userfrom',) 
+1

코드의 실제 예를 보여줄 수 있습니까? 그 자체로 이것은 실제로 질문에 대답하지 않습니다. – brandonscript

관련 문제