我不知道我这样做是否正确,但我在保存与DRF串行化程序的关系方面有问题。
假设我有一个MessageBoard和一些MessageBoardPosts
Post有一个序列化程序,类似于:
class MessageBoardPostSerializer(serializers.ModelSerializer):
class Meta:
model = MessageBoardPost
fields = '__all__'我想通过投递到/api/ MessageBoard /PK/create/来添加一个Post,为此,我向MessageBoard视图集添加了一个操作:
@action(detail=True, methods=['post'], permission_classes=[MatchesMessageboardVisibility])
def create_post(self, request, pk=None):
# Messageboard to post to
messageBoard = MessageBoard.objects.get(pk=pk)
if messageBoard is not None:
serializer = MessageBoardPostSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data)由于MessageBoard是post上必需的FK,所以在视图集中创建post时,我会得到验证错误。
解决这个问题的最好方法是什么?
发布于 2020-02-02 15:49:41
序列化程序(我假设"message_board“是MessageBoardPost模型中的ForeignKey ):
class MessageBoardPostSerializer(serializers.ModelSerializer):
# this is read only by default which means serializer will not require that field
message_board = serializers.StringRelatedField()
class Meta:
model = MessageBoardPost
fields = '__all__'Viewset操作:
@action(detail=True, methods=['post'], permission_classes=[MatchesMessageboardVisibility])
def create_post(self, request, pk=None):
# Messageboard to post to
messageBoard = get_object_or_404(MessageBoard, pk=pk)
serializer = MessageBoardPostSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
# here you can pass data without validation directly to the save method
serializer.save(message_board=messageBoard)
return Response(serializer.data)中预取。
发布于 2020-02-02 15:45:44
可以将MessageBoard作为上下文传递给序列化程序:
views.py
from django.shortcuts import get_object_or_404
@action(detail=True, methods=['post'], permission_classes=[MatchesMessageboardVisibility])
def create_post(self, request, pk=None):
# Messageboard to post to
message_board = get_object_or_404(MessageBoard, pk=pk)
context = {'message_board': message_board}
serializer = MessageBoardPostSerializer(data=request.data, context=context)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data)serializers.py
class MessageBoardPostSerializer(serializers.ModelSerializer):
class Meta:
model = MessageBoardPost
fields = '__all__'
def create(self, validated_data):
post = MessageBoardPost(**validated_data)
post.message_board = self.context['message_board']
post.save()
return posthttps://stackoverflow.com/questions/60026322
复制相似问题