我想实现POST方法来创建Article对象。 我必须提供这个正文:
{
"title": "Sample title",
"link": "https://www.sample.com/"
}
并获取具有自动分配的ID,author_name(当前用户)和creation_date的Article对象。 但是我遇到了一个问题-“创建” methor删除了一个字段-author_name。 (请参见下面的代码) 最后我得到下一个错误消息:
IntegrityError at /api/articles/
Error: Null value in column "author_name_id" with NOT NULL
DETAIL: Error row contains (32, Sample title, https://www.sample.com/, 2020-11-08, null).
我该如何解决我的问题?
class Article(models.Model):
title = models.CharField(
name='title',
max_length=120,
null=False,
)
link = models.URLField(
name='link',
unique=True,
null=False,
)
creation_date = models.DateField(
name='creation_date',
default=date.today,
null=False,
)
author_name = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='articles',
null=False,
)
def __str__(self):
return self.title
class ArticleView(APIView):
def post(request):
if request.user.is_authenticated:
data = {"author_name": request.user}
data.update(request.data)
print(request.data)
serializer = ArticleSerializer(data=data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(status=201)
return Response(status=403)
request.data >>> {'title':'样本标题','link':'https://www.sample.com/','author_name':
class ArticleSerializer(serializers.ModelSerializer): author_name = serializers.StringRelatedField()
class Meta:
model = Article
fields = "__all__"
def create(self, validated_data):
print(validated_data)
return Article.objects.create(**validated_data)
validated_data >>> {'title':'样本标题','link':'https://www.sample.com/'}
答案 0 :(得分:1)
我认为这是因为您在序列化程序上使用了author_name = serializers.StringRelatedField()
。默认情况下,这是一个只读字段,因此序列化程序会将其从传递给它的数据中删除。
我很确定您是否会这样做:
serializer = ArticleSerializer(request.data)
if serializer.is_valid():
serializer.save(author_name=request.user)
这应该可以解决您的问题。因为在序列化器上,您需要验证非只读字段,然后通过将用户实例传递给序列化器的save方法来保存数据。
我还看到您正在使用ApiView创建模型实例,我建议您研究CreateApiView