【问题标题】:How can I highlight a section of an article in the backend using django rest framework如何使用 django rest 框架在后端突出显示文章的一部分
【发布时间】:2019-06-24 11:25:14
【问题描述】:

这就是我创建文章的方式

`类 CreateArticleView(ListCreateAPIView): """ 类处理文章的创建 """

permission_classes = (IsAuthenticatedOrReadOnly,)
serializer_class = ArticleSerializer
renderer_classes = (ArticleJSONRenderer,)
queryset = Article.objects.all()

def list(self, request, *args, **kwargs):
    queryset = Article.objects.all()
    serializer = self.serializer_class(queryset, many=True)
    return Response(serializer.data)

def post(self, request, *args, **kwargs):
    article = request.data.get('article', {})

    if self.request.user.is_verified is False:
        message = error_messages['email_verification']
        return Response(message, status=status.HTTP_401_UNAUTHORIZED)

    context = {"request": request}
    serializer = self.serializer_class(data=article, context=context)
    serializer.is_valid(raise_exception=True)
    serializer.save(author=request.user)
    return Response(serializer.data, status=status.HTTP_201_CREATED)`

`

这是我查看一篇文章的方式,因此我想获取一篇文章并能够突出显示文章的几个部分并设法对它们发表评论

class GetUpdateDeleteArticle(RetrieveUpdateDestroyAPIView):
permission_classes = (IsAuthenticated,)
renderer_classes = (ArticleJSONRenderer,)
queryset = Article.objects.all()
serializer_class = ArticleSerializer
lookup_field = 'slug'

@staticmethod
def validate_author(request, article):
    if request.user.pk != article.author_id:
        message = error_messages['unauthorised']
        return Response(message, status.HTTP_403_FORBIDDEN)

def get(self, request, *args, **kwargs):
    """
    :param request: user requests to get an article
    :param kwargs: slug field is passed in the url
    :return: data and response if article exists
    """

    try:
        article = Article.objects.get(slug=kwargs['slug'])
    except Article.DoesNotExist:
        message = error_messages['article_404']
        return Response(message, status=status.HTTP_404_NOT_FOUND)

    serializer = ArticleSerializer(
        instance=article, context={'request': request})
    return Response(serializer.data, status=status.HTTP_200_OK)

【问题讨论】:

    标签: python django-rest-framework highlight


    【解决方案1】:

    这更多是模型级别的设计决策,而不是 API 问题。我会采用以下数据库设计:

    模型 Highlight 存储对文章的引用、文本突出显示部分的开始索引和结束索引。所以,大致是这样的:

    class Highlight(models.Model):
        article = models.ForeignKey(Article, related_name='highlights')
        start = models.PositiveIntegerField()
        end = models.PositiveIntegerField()
    

    然后是评论模型。一个常见的设计是使用generic relations,以便 cmets 可以与应用程序中的任何模型一起使用。这样的事情就足够了:

    class Comment(TimeStampedModel):
        text = models.TextField(blank=False)
        author = models.ForeignKey(User, related_name='comments')
        content_type = models.ForeignKey(ContentType)
        object_id = models.PositiveIntegerField()
        content_object = GenericForeignKey('content_type', 'object_id')
    

    您现在可以围绕此设计构建 API,客户端通过发送突出显示文本的文章 ID、开始和结束索引来创建突出显示。也可以使用突出显示的 id 创建评论。检索文章的亮点也应该相当容易实现。

    【讨论】:

    • 感谢您的帮助。
    • @sylvia 不客气。另外,如果你没问题,那么不要忘记接受答案
    • 如果我在文章正文中有一个图片链接,是否可以在突出显示时跳过它
    • @sylvia 现在有点复杂。根据您使用的标记语言,您可以使用一些库(如 beautiful soup 或其他库)将所有额外的实体与正文分开。但这实施起来会很复杂
    猜你喜欢
    • 2021-12-26
    • 2019-02-26
    • 1970-01-01
    • 2017-03-22
    • 2013-02-28
    • 2015-03-30
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    相关资源
    最近更新 更多