模型.py
class PostCategory(models.Model):
name = models.CharField(max_length=200, unique=True)
user = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.name
class Post(models.Model):
title = models.CharField(max_length=255)
user = models.ForeignKey(User, on_delete=models.DO_NOTHING)
content = models.TextField()
post_categories = models.ManyToManyField(PostCategory, blank=True)
def __str__(self):
return self.title
序列化器.py
class PostSerializer(serializers.ModelSerializer):
user = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault())
class Meta:
model = Post
exclude = []
def create(self, validated_data):
# Retrieve the currently logged-in user
user = self.context['request'].user
# Add the author user to the validated data
validated_data['user'] = user
# Create and return the Post instance
post = Post.objects.create(**validated_data)
return post
views.py
class PostCreateView(APIView):
def post(self, request):
if request.user.is_authenticated:
serializer = PostSerializer(data = request.data, context={'request': request})
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)
通过POST方法从前端传递数据
FormData(3) { title → "Title 1", content → "Content 1", post_categories → "web framework,javascript"}
我正在使用 Django REST Framework 并尝试实现多对多关系。我正在将数据从前端发送到 drf 后端。现在我面临的错误是:
post_categories [“类型错误。预期pk值,收到str。” ]
这是显而易见的。我相信错误是正确的,但我不知道如何修复它。我还认为一旦解决这个问题我将面临另一个错误:
禁止直接分配到多对多集的前向端。使用 post_categories.set() 代替。
所以我也想知道如何解决这个问题。请帮忙。
您遇到的错误“类型不正确。预期的 pk 值,收到的字符串。”是因为您发送的是帖子类别的字符串表示形式(“web 框架,javascript”),而不是类别的主键值创建 Post 实例时。您需要修改从前端发送数据的方式以包含所选类别的主键。
要解决此问题,您可以进行以下更改:
前端:
从前端发送数据时,您应该发送代表所选类别的主键(PK)数组,而不是字符串
{
"title": "Title 1",
"content": "Content 1",
"post_categories": [1, 2] // Replace 1 and 2 with the actual PKs of selected categories
}
DRF 串行器:
更新您的 PostSerializer 以接受 post_categories 字段的主键列表:
class PostSerializer(serializers.ModelSerializer):
user = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault())
post_categories = serializers.PrimaryKeyRelatedField(many=True, queryset=PostCategory.objects.all()) # Add this line
class Meta:
model = Post
exclude = []
def create(self, validated_data):
# Retrieve the currently logged-in user
user = self.context['request'].user
# Add the author user to the validated data
validated_data['user'] = user
# Create and return the Post instance
post = Post.objects.create(**validated_data)
return post
serializers.PrimaryKeyRelatedField(many=True, queryset=PostCategory.objects.all()) 行允许您接受 post_categories 字段的主键数组。
通过这些更改,您的 DRF 视图应该能够正确接受来自前端的数据,并且您不会遇到“类型错误”错误。另外,保存Post实例时,将正确建立与post_categories的多对多关系,无需直接赋值。