2017-04-19 11 views
0

を私はアサイは、私は、サーバーを実行したときに を譲受人にタスクを割り当てると、私はこのエラーを取得するタスクを追加しようとすることができるアプリを作っています:rest_framework NOT NULL制約に失敗しました:tasks_tasks.assigner_id

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は - これはあなたの問題です。私はあなたの代わりに二つのフィールドを定義することによってこの問題を回避できると思い、READ_ONLY 1と1 WRITE_ONLY:このコードの

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') 

効果は、あなたのシリアライザは、「書き込み」(デシリアライズ)であるとき、それは、割当を受け入れるということですあなたはキーワード引数assignerとしてsaveメソッドに渡します。その後、jsonにタスクをシリアル化すると、assigner.nameが検索され、assigner_nameというキーで返され、assignerが出力されなくなります。ビューで

、あなたはその後、メソッドを保存シリアライザに(むしろオブジェクト全体よりも)主キーを渡したい:

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

rest_frame作業のチュートリアルでは、そのように行われていた、私はウルの提案をしましたしかし、今私は別の問題を持っています。割り当て担当者を選ぶ必要があり、自動的に宣言されません。とにかく問題が解決され、私は今すぐ仕事を追加することができます –

+0

その作品はあなたが私の答えを受け入れることができますか? – FraserES

+0

それは自動的には何ですか? – FraserES

関連する問題