如何解决基于Django类的CreateApiView author_id不为null?
我还使用令牌对它进行了身份验证,但是当我创建新的发布错误时会提示IntegrityError at /api/create/ NOT NULL constraint failed: core_article.author_id
,如何在序列化程序中与请求用户一起验证数据?
model.py
from django.contrib.auth.models import User
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=255,help_text="Short title")
content = models.TextField(blank=True)
author = models.ForeignKey(User,on_delete=models.CASCADE)
status = models.BooleanField(default=True)
def __str__(self):
return self.title
serializer.py
from rest_framework import serializers
from django.contrib.auth.models import User
from core.models import Article
class NewsSerializer(serializers.ModelSerializer):
author = serializers.SlugRelatedField(
slug_field=User.USERNAME_FIELD,read_only=True,required=False)
class Meta:
model = Article
fields = [
'id','author','title','content','status',]
views.py
class ArticleCreate(CreateAPIView):
queryset = Article.status_objects.all()
serializer_class = NewsSerializer
permission_classes = (permissions.IsAuthenticated,)
解决方法
author = serializers.SlugRelatedField(
slug_field=User.USERNAME_FIELD,read_only=True,required=True)
请将required=False
更改为required=True
。如果设置为True,则不要添加Null值。因此,您可以避免这种错误。
我不知道这是否是您要寻找的,但是您可以将用户作为作者对象传递给序列化器,并在序列化器中使用该作者创建您的Article
对象(注意:假设您在视图中使用了正确的authentication_class
,并且可以从请求对象访问用户)。
首先,您需要覆盖视图的执行创建:
class ArticleCreate(CreateAPIView):
queryset = Article.status_objects.all()
serializer_class = NewsSerializer
permission_classes = (permissions.IsAuthenticated,)
def perform_create(self,serializer):
serializer.save(author=self.request.user)
这会将用户实例发送到您的序列化器验证的数据。然后,您应该将序列化器更改为:
class NewsSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = [
'id','title','content','status',]
请注意,行author = serializers.SlugRelatedField(slug_field=User.USERNAME_FIELD,required=False)
和author
已从序列化程序中删除。但是,如果您需要序列化该作者的ID(只读),则可以将序列化器更改为:
class NewsSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = [
'id','author',]
read_only_fields = ('author',)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。