DRF“创建”方法从“ validated_data”中删除字段

时间:2020-11-08 13:36:09

标签: python django django-rest-framework

我想实现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).

我该如何解决我的问题?

models.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

views.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 >>> {'title':'样本标题','link':'https://www.sample.com/','author_name':>}

serializers.py

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/'}

1 个答案:

答案 0 :(得分:1)

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

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

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

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

相关问题