django - 将 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."
]
}
]
}
请帮我解决问题。提前致谢
解决方案
我有一个解决方案。你将不得不改变你的 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]
}
推荐阅读
- python - 如何在这里从 span=(2494, 2516) 获取第一个数字?
- python - Paramiko 中只有 pwd 命令成功,其他命令失败并显示“ksh: ...: cannot execute - No such file or directory”
- excel - 复制并粘贴到名称不等于列表中值的工作表?
- python - CSV 文件已写入,但输出不正确
- http - 无法成功实现 http.Handler
- mysql - Cannot connect from Sequalize.js, can connect from MySQL client
- assembly - 组装:嵌套循环的问题
- c++ - 无法在 main 中调用 struct 函数
- python - 来自 PIL 的图像中的 PermissionError
- c++ - 编译与 libmpfr.so 相关的 GCC 8.2.0 时出现链接器错误