微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

django-rest-framework 中的通用关系序列化

如何解决django-rest-framework 中的通用关系序列化

你能帮我看看 Django rest 框架中泛型关系的序列化吗?我需要获取 SWOT 对象的数据,包括公司及其所有评论。我在检索通用字段评论时遇到问题。

models.py

   class SWOT(models.Model):
       name = models.CharField(max_length=500,default='') 
       description = models.CharField(max_length=500,default='',blank=True)
       company = models.ForeignKey(Company,on_delete=models.CASCADE)

       #Generic Relation for comments
       comments = GenericRelation(Comment)

       def __str__(self):
           return self.name

   class Comment(models.Model):
       author = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
       text = models.TextField(verbose_name="")
       created_date = models.DateTimeField(default=timezone.Now)

       content_type = models.ForeignKey(ContentType,on_delete=models.CASCADE)
       object_id = models.PositiveIntegerField()
       content_object = GenericForeignKey()   

views.py

class SwotView(generics.ListAPIView):
      serializer_class = SwotSerializer

      def get_queryset(self):
         swot_id = self.kwargs['swot_id']

         return SWOT.objects.filter(id=swot_id)

serializers.py

class CommentRelatedField(serializers.RelatedField):

     def to_representation(self,value):

        if isinstance(value,SWOT):
            serializer = SwotSerializer(value)
        else:
            raise Exception('Unexpected type of comment ',type(value))

        return serializer.data

class SwotSerializer(serializers.ModelSerializer):

        company = CompanySerializer()
        comments = CommentRelatedField(many=True,queryset=Comment.objects.all())

        class Meta:
           model = SWOT
           fields = ('id','name','description','company','comments')

我已尝试实现 documentation 中示例中的代码,但我解决错误。不知道为什么对象的类型是Comment而不是SWOT。

The error

你能告诉我我能做些什么来使这段代码像在文档中一样工作,或者提出另一种解决方案,如文档建议的常规关系字段。

请注意,使用 GenericRelation 字段表示的反向通用键可以使用常规关系字段类型进行序列化,因为关系中的目标类型始终是已知的。

提前致谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。