0

Django レスト フレームワークでのジェネリック リレーションのシリアル化について教えてください。会社とそのすべてのコメントを含む 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')

ドキュメントの例のコードを実装しようとしましたが、エラーに取り組みました。オブジェクトのタイプが SWOT ではなくCommentである理由がわかりません。

エラー

このコードをドキュメントと同じように機能させるために何ができるか、またはドキュメントが示唆する通常のリレーショナル フィールドのような別のソリューションを提案してください。

GenericRelation フィールドを使用して表現されたリバース ジェネリック キーは、通常のリレーショナル フィールド タイプを使用してシリアル化できることに注意してください。これは、関係のターゲットのタイプが常に既知であるためです。

前もって感謝します。

4

0 に答える 0