首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DRF序列化程序自定义创建

DRF序列化程序自定义创建
EN

Stack Overflow用户
提问于 2020-02-02 12:57:22
回答 2查看 2.4K关注 0票数 1

我不知道我这样做是否正确,但我在保存与DRF串行化程序的关系方面有问题。

假设我有一个MessageBoard和一些MessageBoardPosts

Post有一个序列化程序,类似于:

代码语言:javascript
复制
class MessageBoardPostSerializer(serializers.ModelSerializer):
  class Meta:
      model = MessageBoardPost
      fields = '__all__'

我想通过投递到/api/ MessageBoard /PK/create/来添加一个Post,为此,我向MessageBoard视图集添加了一个操作:

代码语言:javascript
复制
@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时,我会得到验证错误。

解决这个问题的最好方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-02 15:49:41

序列化程序(我假设"message_board“是MessageBoardPost模型中的ForeignKey ):

代码语言:javascript
复制
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操作:

代码语言:javascript
复制
@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)

  • 您应该以snake_case样式(如" message_board“等)编写变量。对于更高级的crud,应该使用
  • ,您应该使url /api/留言板/PK/ POST /在其中发布您的帖子,而message_board应该在过高的初始方法

中预取。

票数 2
EN

Stack Overflow用户

发布于 2020-02-02 15:45:44

可以将MessageBoard作为上下文传递给序列化程序:

views.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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 post
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60026322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档