2017-04-19 52 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:

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一个只读场源assigner.username - 这是你的问题。我想你可以解决这个问题通过定义两个字段而是一个READ_ONLY和一个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') 

这段代码的作用是,当你的序列化是“写作”(反序列),它将接受出让方您将其传入存储方法的ID作为关键字参数assigner。然后,当它将任务序列化为json时,它会查找assigner.name,并将其返回到密钥assigner_name下,并错过assigner

在视图中,你会再通过主键(而不是整个对象)到串行保存方法:

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

在rest_frame工作教程有人这样做,我也建议乌尔,但现在我又遇到另一个问题,你必须选择分配器,而不是自动声明。但问题无论如何解决,我现在可以添加任务 –

+0

如果这个作品可以请你接受我的答案? – FraserES

+0

它不是自动的? – FraserES

相关问题