首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rest_framework NULL约束失败: tasks_tasks.assigner_id

rest_framework NULL约束失败: tasks_tasks.assigner_id
EN

Stack Overflow用户
提问于 2017-04-19 23:08:27
回答 1查看 1.2K关注 0票数 0

我正在制作一个应用程序,当我运行服务器并尝试添加一个任务时,转让人可以将任务分配给受让人,并尝试添加一个任务,我得到了以下错误:

NULL约束失败: tasks_tasks.assigner_id

以下是我的看法:

代码语言:javascript
复制
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

代码语言:javascript
复制
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:

代码语言:javascript
复制
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',)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-19 23:30:08

您已经将assigner设置为具有源assigner.username -this的只读字段,这是您的问题。我认为您可以通过定义两个字段(一个read_only和一个write_only)来解决这个问题:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
serializer.save(assigner=self.request.user.pk)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43507531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档