我有一个模型评论,可以在项目或任务上进行。
class Comment(BaseCommentModel):
author = models.ForeignKey(settings.AUTH_USER_MODEL)
content_type = models.ForeignKey(
ContentType,
verbose_name=_('content type'),
related_name="contenttype_set_for_%(class)s"
)
object_pk = models.TextField(_('object ID'))
content_object = GenericForeignKey(ct_field="content_type", fk_field="object_pk")
项目和任务将字段设置为:
comments = GenericRelation(Comment)
可以在Projects或Tasks上创建注释,因此每个应该有一个视图集:
class ProjectCommentViewSet(viewsets.ViewSet):
class TaskCommentViewSet(viewsets.ViewSet):
那些会显示与每个模型相关的评论。
但我不明白的是:
如何在评论模型的视图集中设置创建/更新/删除,以便使用正确的关系创建评论?
如何在视图集内过滤以显示与该模型相关的注释?我不能使用select_related,因为Comment没有Project或Task字段。
如何为这些关系编写HyperlinkedModelSerializer
s?我是否需要向CommentSerializer()添加HyperlinkedIdentityField
,然后将HyperlinkedRelatedField
添加到用户,项目和任务序列化程序?或者我该如何设置?
感谢您提供的任何帮助,我真的可以在这里使用一些方向。
我无法理解模型上的关系如何转换为序列化程序和视图集。以及如何在使用通用关系时处理关系。
答案 0 :(得分:1)
关键是使用PrimaryKeyRelatedField
。这将返回一个id列表,这将用于创建/更新具有相关Project
记录的Comment
模型实例。
除此之外,GenericRelation
的行为与django-rest-framework
中的其他ORM关系一样。
在ViewSet
Serializer
中定义如下:
from rest_framework import viewsets, serializers
class ProjectCommentViewSet(viewsets.ViewSet):
queryset = Project.objects.all()
serializer_class = ProjectSerializer
class ProjectSerializer(serializers.ModelSerializer):
comments = serializers.PrimaryKeyRelatedField(
queryset=Comment.objects.all(), many=True, required=False)
class Meta:
model = Project
fields = ('id', 'etc...', 'comments',)