Python django rest框架中的泛型关系序列化

Python django rest框架中的泛型关系序列化,python,django,django-rest-framework,restapi,django-generic-relations,Python,Django,Django Rest Framework,Restapi,Django Generic Relations,你能帮我完成Django rest框架中泛型关系的序列化吗。我需要获取SWOT对象的数据,包括公司及其所有评论。我在检索注释时遇到问题,这是一个通用字段 型号.py: class SWOT(models.Model): name = models.CharField(max_length=500, default='') description = models.CharField(max_length=500, default='', blank=True)

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

型号.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()   
class SwotView(generics.ListAPIView):
      serializer_class = SwotSerializer

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

         return SWOT.objects.filter(id=swot_id)
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')
视图.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()   
class SwotView(generics.ListAPIView):
      serializer_class = SwotSerializer

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

         return SWOT.objects.filter(id=swot_id)
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')
序列化程序.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()   
class SwotView(generics.ListAPIView):
      serializer_class = SwotSerializer

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

         return SWOT.objects.filter(id=swot_id)
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')
我曾尝试在中实现示例中的代码,但我解决了错误。我不知道为什么对象的类型是评论而不是SWOT

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

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


提前谢谢。

嗨!很好的努力,但是对于相关领域如何工作,这里似乎存在一些误解。您正在检查
commentrelated字段中的
SWOT
实例,但它将始终接收
Comment
实例,因为您已将它的
queryset
定义为
Comment.objects.all()
。因此,尽管您在
SwotSerializer
中使用它,但实际上您正试图用
commentrelated字段来表示
Comment
-这解释了您的错误,因为您需要
SWOT
s。这有意义吗?