Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python rest\u框架非空约束失败:tasks\u tasks.assigner\u id_Python_Django_Django Rest Framework_Notnull - Fatal编程技术网

Python rest\u框架非空约束失败:tasks\u tasks.assigner\u id

Python rest\u框架非空约束失败:tasks\u tasks.assigner\u id,python,django,django-rest-framework,notnull,Python,Django,Django Rest Framework,Notnull,我正在制作一个应用程序,分配者可以将任务分配给分配者 当我运行服务器并尝试添加任务时,出现以下错误: 非空约束失败:任务\u tasks.assigner\u id 以下是我的看法: from rest_framework import viewsets, permissions from .models import Tasks from .serializers import TasksSerializer, UserSerializer from django.contrib.auth.m

我正在制作一个应用程序,分配者可以将任务分配给分配者 当我运行服务器并尝试添加任务时,出现以下错误:

非空约束失败:任务\u tasks.assigner\u 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')
最后是my 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',)

您已使用source
assigner.username将
assigner
设置为只读字段-这是您的问题。我认为您可以通过定义两个字段来解决这个问题,一个是只读字段,另一个是只读字段:

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')
此代码的作用是,当序列化程序正在“写入”(反序列化)时,它将接受传递到save方法中的赋值器id作为关键字参数
赋值器
。然后,当它将任务序列化为json时,它将查找
assigner.name
,并在键
assigner\u name
下返回它,然后错过
assigner

在视图中,然后将主键(而不是整个对象)传递给序列化程序保存方法:

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

您已使用source
assigner.username将
assigner
设置为只读字段-这是您的问题。我认为您可以通过定义两个字段来解决这个问题,一个是只读字段,另一个是只读字段:

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')
此代码的作用是,当序列化程序正在“写入”(反序列化)时,它将接受传递到save方法中的赋值器id作为关键字参数
赋值器
。然后,当它将任务序列化为json时,它将查找
assigner.name
,并在键
assigner\u name
下返回它,然后错过
assigner

在视图中,然后将主键(而不是整个对象)传递给序列化程序保存方法:

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

在rest_框架教程中,它是这样做的,我做了你的建议,但现在我遇到了另一个问题,你必须选择赋值人,它不会自动声明。但是问题还是解决了,我现在可以添加任务了。这不是自动的什么?有没有办法解决它,而不让用户能够选择分配者并自动分配给当前会话的用户?只是想检查一下,
perform\u create
中的键入是否也在您的代码中?您将其编写为
preform
而不是
perform
。我认为这实际上可能是您最初的问题-您可以返回到以前的实现,只需更正此输入错误,它就会很好地工作。我在代码中编写它并执行,在rest_框架教程中仍然存在相同的问题。它是这样做的,我做了您的建议,但是现在我遇到了另一个问题,你必须选择赋值人,而且它不是自动声明的。但是问题还是解决了,我现在可以添加任务了。这不是自动的什么?有没有办法解决它,而不让用户能够选择分配者并自动分配给当前会话的用户?只是想检查一下,
perform\u create
中的键入是否也在您的代码中?您将其编写为
preform
而不是
perform
。我认为这实际上可能是您最初的问题-您可以返回到以前的实现,只需纠正这个输入错误,它就会很好地工作。我在代码中编写它并执行,但仍然存在相同的问题