我正在尝试获取与提交相关的所有标签。当我点击端点以获取所有提交时,它成功返回标签列表,但是当我点击特定提交时,我得到 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}
首先,我建议您在类的顶部使用此脚本
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
中传递作者,然后将其从列表中删除。