首页 > 解决方案 > 将 ManyToManyFiled 与相应的模型 API 链接

问题描述

我有两个模型“书”和“作者”。我在“作者”模型中有作者详细信息。我正在使用 API 创建“书籍”。我想使用“Author_id”将“作者”与“书”链接起来。

我试过以下代码。

模型.py:

class Author(models.Model):
   name = models.CharField(max_length=64)

class Book(models.Model):
   name = models.CharField(max_length=64)
   author = models.ManyToManyField(Author,related_name='author')

视图.py

 class BookListView(APIView):

    def post(self, request, format=None):
        serializer = BookSerializer(data=request.data)
        if serializer.is_valid():
           serializer.save()
           return Response(serializer.data, 
        status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

序列化程序.py:

  class AuthorSerializer(serializers.ModelSerializer):
       class Meta:
           model = Author
           fields = ('name', )

  class BookSerializer(serializers.ModelSerializer):
      assessments = AuthorSerializer(many=True, required=False)

      class Meta:
         model = Book
         fields = ('name', 'authors')


       def create(self, validated_data):
          print(validated_data)
          authors = validated_data.pop('authors')
          book = Book(**validated_data)
          book.save()
          return book

我在“作者”表中有以下作者。

  id        name
  1         Alex
  2         John
  3         Bob

用于创建书的示例 JSON 文件:

   {
     "name":"Product 002",
     "authors":
        [
          {
            "author_id":2
          },
          {
            "author_id":1
          }
        ]
    }

保存书籍时会出现以下错误。

    {
      "authors": [
         {
            "name": [
               "This field is required."
           ]
         },
         {
            "name": [
               "This field is required."
             ]
          }
       ]
   }

json文件2:

  {
     "name":"Product 002",
     "authors":
        [
          {
            "name": Alex,
            "author_id":1
          },
          {
            "name": "John"
            "author_id":1
          }
        ]
    }

保存书籍时会出现以下错误。

    {
      "authors": [
          {
            "name": [
                  "author with this name already exists."
             ]
          },
          {
              "name": [
                  "author with this name already exists."
              ]
          }
      ]
   }

请帮我解决问题。提前致谢

标签: djangopython-3.xdjango-rest-framework

解决方案


我有一个解决方案。你将不得不改变你的 serializers.py

class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = ('id', 'name', )

class BookSerializer(serializers.ModelSerializer):
    authors= serializers.SerializerMethodField(required=False)

    class Meta:
        model = Book
        fields = ('name', 'authors')

    def create(self, validated_data):
        print(validated_data)
        book = Book(**validated_data)
        book.save()
        return book

    @staticmethod
    def get_authors(obj):
        return AuthorSerializer(obj.author.all(), many=True).data

通过声明

authors= serializers.SerializerMethodField(required=False)

您可以在列表中传递作者的主键(在 ManyToManyField 中,它的类型设置为不是列表,但可以将列表发送到存储作者),同时返回带有作者 ID 和姓名列表的 json 序列化数据。

您的 json 请求正文将是:

{
     "name":"Product 002",
     "authors": [1, 2]
}

推荐阅读