在 Django 中序列化 ManytoMany 字段

问题描述 投票:0回答:1

我正在尝试获取与提交相关的所有标签。当我点击端点以获取所有提交时,它成功返回标签列表,但是当我点击特定提交时,我得到 null 作为值。

这是我的模型

class Tag(models.Model):
    title = models.CharField(max_length=50,)       

    def __str__(self):
        return str(self.title)


class Submission(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=300, null=True, blank=True)
    abstract = models.TextField(null=True, blank=True)
    comment_for_editor = models.TextField(null=True, blank=True)
    completion_status = models.BooleanField(default=False)
    tags = models.ManyToManyField("Tag", blank=True, related_name='tags')
    section = models.ForeignKey("Section", on_delete=models.CASCADE, null=True, blank=True)

这是我的序列化器

class TagSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tag
        fields = ['title']

class startSubmissionSerializer(serializers.ModelSerializer):
    files = SubmissionFilesSerializer(many=True, required=False)
    tags = TagSerializer(many=True, read_only=True)
    
    class Meta:
        model = Submission
        fields = ['section', 'title', 'abstract', 'comment_for_editor', 'completion_status', 'files','tags', 'id']


    def create(self, validated_data):
        user = self.context['user']
        
        files = validated_data.pop('files', [])
        tags = validated_data.pop('tags', None)

        submission = Submission.objects.create(
            author=user,
            **validated_data
        )
        
        tags = str(tags['title']).split(', ')
        print(tags)
        for tag_title in tags:
            tag, _ = Tag.objects.get_or_create(title = tag_title)
            submission.tag.add(tag)
        submission.save()
        
        
        if files != []:
            for file in files:
                SubmissionFiles.objects.create(
                    submission = submission,
                    **file
                )

        return submission

我收回了所有提交的内容

[ { “部分”:1, "title": "新提交11", "摘要": "diqgduigodui", "comment_for_editor": "hodihcioshiochiohsioc", “completion_status”:假, “文件”:[], “标签”:[ { “标题”:“生物学” }, { “标题”:“英文” }, { “标题”:“数学” }, { “标题”:“YouTube” } ], “编号”:12 }, { “部分”:1, "title": "新提交12", "摘要": "diqgduigodui", "comment_for_editor": "hodihcioshiochiohsioc", “completion_status”:假, “文件”:[], “标签”:[ { “标题”:“生物学” }, { “标题”:“英文” }, { “标题”:“数学” }, { “标题”:“YouTube” } ], “ID”:13 } ]

但是当我点击提交/13时我得到了这个 { “节”:空, “标题”:空, “摘要”:空, “comment_for_editor”:空 }

这是我的看法

class SubmissionView(ModelViewSet):

    """
    View your submissions
    Delete one of your submission   
    Update one of your submission
    Read one of your submission
    """

    # queryset = Submission.objects.all()
    serializer_class = startSubmissionSerializer


    def get_object(self):
        user = self.request.user
        return Submission.objects.prefetch_related('tags').filter(author=user)
    

    def get_queryset(self):
        user = self.request.user
        return Submission.objects.prefetch_related('tags').filter(author=user)
    
    
    def get_serializer_context(self):
        user = self.request.user
        return {'user': user}
python django django-models django-rest-framework django-serializer
1个回答
0
投票

首先,我建议您在类的顶部使用此脚本

startSubmissionSerializer
,而不是通过上下文将经过身份验证的用户传递给序列化器

author= serializers.HiddenField(default=serializers.CurrentUserDefault(), write_only=True)

因此,您不需要重写该函数

get_serializer_context
。一般来说,如果您希望序列化器中经过身份验证的用户可以使用
self.context["request"].user
。如果您没有覆盖并更改视图类中的上下文,它将起作用。

现在谈谈你的问题。视图类中函数

get_object
get_queryset
中的查询是相同的。函数
get_object
不应再返回零个或一个实例。在您编写的查询中,它可能返回零个、一个或多个实例。另一个可能导致该问题的问题是,我认为您的 URL
submission/13
中的数字 13 指的是提交的 id,但您没有在函数
get_object
的查询中使用它。

我可以给你的一个提示是,当你调试代码时,你可以在

startSubmissionSerializer
中传递作者,然后将其从列表中删除。

© www.soinside.com 2019 - 2024. All rights reserved.