DRF 'create'方法从'validated_data'中删除字段



我想实现POST方法来创建Article对象。我必须提供这个机构:

{
"title": "Sample title",
"link": "https://www.sample.com/"
}

并获取具有自动分配的ID、author_name(当前用户(和creation_date的Article对象。但我遇到了一个问题——";创建";metor删除了一个字段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).

我该如何解决我的问题?

型号.py

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

视图.py

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>gt>{'title':'示例标题','链接':'https://www.sample.com/','author_name':<SimpleLazyObject:<用户:admin>gt;}

serializers.py

类ArticleSerializer(serializers.ModelSerializer(:author_name=序列化程序。StringRelatedField((

class Meta:
model = Article
fields = "__all__"

def create(self, validated_data):
print(validated_data)
return Article.objects.create(**validated_data)

validated_data>gt>{'title':'示例标题','链接':'https://www.sample.com/'}

我认为这是因为您的序列化程序上有author_name = serializers.StringRelatedField()。默认情况下,这是一个只读字段,因此序列化程序将从您传递给它的数据中删除它。我很确定你是否会这么做:

serializer = ArticleSerializer(request.data)
if serializer.is_valid():
serializer.save(author_name=request.user)

这应该能解决你的问题。因为在序列化程序上验证非只读字段,然后通过将用户实例传递给序列化程序的保存方法来保存数据。

我还看到您正在使用ApiView创建模型实例,我建议您查看CreateApiView

最新更新