Python DRF&x27;创建';方法从';验证数据';

Python DRF&x27;创建';方法从';验证数据';,python,django,django-rest-framework,Python,Django,Django Rest Framework,我想实现POST方法来创建Article对象。 我必须向本机构提供: { "title": "Sample title", "link": "https://www.sample.com/" } 并获取具有自动分配ID、作者姓名(当前用户)和创建日期的文章对象。 但我遇到了一个问题——“创建”方法删除了一个字段——作者的名字。(见下面的代码) 最后我得到下一个错误消息: IntegrityError at /api

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

{
"title": "Sample title",
"link": "https://www.sample.com/"
}
并获取具有自动分配ID、作者姓名(当前用户)和创建日期的文章对象。 但我遇到了一个问题——“创建”方法删除了一个字段——作者的名字。(见下面的代码) 最后我得到下一个错误消息:

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).
我如何解决我的问题

models.py views.py
request.data>>>{'title':'Sample title','link':'https://www.sample.com/“,”作者姓名“:}

序列化程序.py 类ArticleSerializer(serializers.ModelSerializer): author\u name=serializers.StringRelatedField()



验证的_数据>>>{'title':'Sample title','link':'https://www.sample.com/“}

我想这是因为序列化程序上有
作者\u name=serializers.StringRelatedField()
。默认情况下,这是一个只读字段,因此序列化程序将从传递给它的数据中删除它。 我很确定,如果你愿意:

serializer = ArticleSerializer(request.data)
if serializer.is_valid():
    serializer.save(author_name=request.user)
这应该能解决你的问题。因为在序列化程序上验证非只读字段,然后通过将用户实例传递给序列化程序的save方法来保存数据


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

谢谢您,我的英雄
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)
class Meta:
    model = Article
    fields = "__all__"


def create(self, validated_data):
    print(validated_data)
    return Article.objects.create(**validated_data)
serializer = ArticleSerializer(request.data)
if serializer.is_valid():
    serializer.save(author_name=request.user)