【问题标题】:Django Rest Framework Generic Relationships and ViewSetsDjango Rest Framework 通用关系和视图集
【发布时间】:2016-06-02 19:15:56
【问题描述】:

我有一个模型评论,可以用于项目或任务。

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

Project 和 Task 的字段设置为:

comments = GenericRelation(Comment)

可以在项目或任务上创建评论,因此每个项目都应该有一个视图集:

class ProjectCommentViewSet(viewsets.ViewSet):

class TaskCommentViewSet(viewsets.ViewSet):

这些将显示与每个模型相关的 cmets。

但我不明白的是:

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

  2. 如何在视图集中过滤以显示与该模型相关的 cmets?我不能使用 select_related,因为评论没有项目或任务字段。

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

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

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

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    关键是使用PrimaryKeyRelatedField。这将返回一个 id 列表,您将使用它来创建/更新具有相关 Comment 记录的 Project 模型实例。

    除此之外,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',)
    

    【讨论】:

    • 我需要在评论序列化器中定义 content_type object_id 和 content_object 的字段吗?
    • 不,这些仅在 model 定义中需要。
    猜你喜欢
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 2016-09-30
    • 2018-03-27
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 2012-12-25
    相关资源
    最近更新 更多