Python Django | Метод POST с вложенным объектом. Ограничение NOT NULL не сработало

Я хочу реализовать метод post с вложенным объектом, который имеет только ID. Когда я использую все поля вложенного объекта post метод работает нормально. Но я хочу передать только одно поле и это ID, остальные поля должны быть необязательными

Теперь я получаю ошибку типа

NOT NULL constraint failed: article_article.author_id

models.py

class Author(models.Model):
    first_name = models.CharField(max_length=20, blank=True, null=True)
    last_name = models.CharField(max_length=20, blank=True, null=True)
    nickname = models.CharField(max_length=20, blank=True, null=True)

    def __str__(self):
        return self.nickname


class Article(models.Model):
    title = models.CharField(max_length=120, unique=True)
    description = models.TextField(blank=True)
    author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='articles')
    created_at = models.DateTimeField(auto_now_add=True, blank=True)
    updated_at = models.DateTimeField(auto_now=True, blank=True)

    def __str__(self):
        return self.title

views.py

class ArticleView(APIView):
    def get(self, request, pk=None):
        if pk:
            article = Article.objects.get(pk=pk)
            serializer = ArticleSerializer(article, many=False)
        else:
            articles = Article.objects.all()
            serializer = ArticleSerializer(articles, many=True)

        return Response(serializer.data)

    def post(self, request):
        data = request.data
        serializer = ArticleSerializer(data=data)
        if serializer.is_valid(raise_exception=True):
            article_saved = serializer.save()
        return Response({"success": "Article '' created successfully".format(article_saved.title)},
                        status=status.HTTP_201_CREATED)

serializers.py

class AuthorSerializer(serializers.Serializer):
    first_name = serializers.CharField(required=False)
    last_name = serializers.CharField(required=False)
    nickname = serializers.CharField(required=False)


class ArticleSerializer(serializers.Serializer):
    title = serializers.CharField(max_length=120)
    description = serializers.CharField()
    author = AuthorSerializer(required=False)

    def create(self, validated_data):
        author_data = validated_data.pop('author', None)

        if author_data:
            author = Author.objects.get_or_create(**author_data)[0]
            validated_data['author'] = author
        return Article.objects.create(**validated_data)

Я понял. Надо было просто добавить в сериализатор поле ID

class AuthorSerializer(serializers.Serializer):
    first_name = serializers.CharField(required=False)
    last_name = serializers.CharField(required=False)
    nickname = serializers.CharField(required=False)

id = serializers.IntegerField()

Вернуться на верх