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