2017-04-19 9 views
0

내가 지정 기 내가 서버를 실행할 때 작업 을 할당 된 사용자 할당하고 난이 오류가 작업을 추가 할 수있는 응용 프로그램을 만드는 중이라서 : tasks_tasks.assigner_id 여기 rest_framework는 NULL 제약 조건이 실패하지 :</p> <p>NOT NULL 제약 조건이 실패 tasks_tasks.assigner_id

내 전망이다 : 여기
from rest_framework import viewsets, permissions 
from .models import Tasks 
from .serializers import TasksSerializer, UserSerializer 
from django.contrib.auth.models import User 


class UserViewSet(viewsets.ReadOnlyModelViewSet): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 


class TasksViewSet(viewsets.ModelViewSet): 
    queryset = Tasks.objects.all() 
    serializer_class = TasksSerializer 
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,) 

    def prefrom_create(self, serializer): 
     serializer.save(self, assigner=self.request.user) 

내 serializers.py입니다

from rest_framework import serializers 
from .models import Tasks 
from django.contrib.auth.models import User 


class TasksSerializer(serializers.ModelSerializer): 
    assigner = serializers.ReadOnlyField(source='assigner.username') 

    class Meta: 
     model = Tasks 
     fields = ('id', 'url', 'title', 'description', 'assigner', 'assignee') 


class UserSerializer(serializers.ModelSerializer): 
    tasks = serializers.HyperlinkedIdentityField(many=True, view_name='tasks_details', read_only=True) 

    class Meta: 
     model = User 
     fields = ('id', 'url', 'username', 'tasks') 

그리고 마지막으로 내 models.py : 당신은 소스와 assigner 읽기 전용 필드를했습니다

from django.db import models 

class Tasks(models.Model): 
    created = models.DateTimeField(auto_now_add=True) 
    title = models.CharField(max_length=100) 
    description = models.TextField() 
    assigner = models.ForeignKey('auth.User', related_name='tasks', on_delete=models.CASCADE) 
    assignee = models.ForeignKey('auth.User', related_name='assigned', on_delete=models.CASCADE) 

    class Meta: 
     ordering = ('created',) 

답변

1

assigner.username이 인격적으로는 문제입니다.

class TasksSerializer(serializers.ModelSerializer): 
assigner_name = serializers.ReadOnlyField(source='assigner.username') 
assigner = serializers.PrimaryKeyRelatedField(write_only=True, queryset=User.objects.all(), required=True) 
class Meta: 
    model = Tasks 
    fields = ('id', 'url', 'title', 'description', 'assigner', 'assignee', 'assigner_name') 

이 코드의 효과 당신의 시리얼 라이저는 '쓰기'(드 직렬화) 인 경우는 할당 기를 수락하는 것입니다 : 나는 두 개의 필드 대신, 하나 READ_ONLY 한 write_only 당신이 정의하여이 문제를 얻을 수 있다고 생각 id를 save 메소드에 키워드 인수 assigner으로 전달합니다. 그런 다음 json으로 작업을 serialize하면 assigner.name을 찾고 assigner_name 키로 반환하고 assigner을 놓칩니다. 뷰에서

, 당신은 다음 저장 시리얼에 (오히려 전체 개체 이상) 기본 키에 방법 전달할 것 : 그것은 그런 식으로 이루어졌다

serializer.save(assigner=self.request.user.pk) 
+0

rest_frame 작업 튜토리얼을, 나는 UR 제안을했다 ,하지만 지금은 할당자를 선택해야하는 또 다른 문제가 발생하고 자동으로 선언되지 않습니다. 그러나 문제는 어쨌든 해결되고 나는 이제 과제를 추가 할 수 있습니다. –

+0

그 작품이 내 대답을 받아 들일 수 있겠습니까? – FraserES

+0

그것은 자동으로 무엇이 아닙니다? – FraserES