Django Rest框架通用关系和ViewSet

时间:2016-06-02 19:15:56

标签: django django-rest-framework

我有一个模型评论,可以在项目或任务上进行。

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):

那些会显示与每个模型相关的评论。

但我不明白的是:

  1. 如何在评论模型的视图集中设置创建/更新/删除,以便使用正确的关系创建评论?

  2. 如何在视图集内过滤以显示与该模型相关的注释?我不能使用select_related,因为Comment没有Project或Task字段。

  3. 如何为这些关系编写HyperlinkedModelSerializer s?我是否需要向CommentSerializer()添加HyperlinkedIdentityField,然后将HyperlinkedRelatedField添加到用户,项目和任务序列化程序?或者我该如何设置?

  4. 感谢您提供的任何帮助,我真的可以在这里使用一些方向。

    我无法理解模型上的关系如何转换为序列化程序和视图集。以及如何在使用通用关系时处理关系。

1 个答案:

答案 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',)