python - 如何使用 django rest 框架在后端突出显示文章的一部分
问题描述
这就是我创建文章的方式
`class 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)
解决方案
这更多是模型级别的设计决策,而不是 API 问题。我会采用以下数据库设计:
一个模型 Highlight ,它存储对文章的引用、文本突出显示部分的开始索引和结束索引。所以,大致是这样的:
class Highlight(models.Model):
article = models.ForeignKey(Article, related_name='highlights')
start = models.PositiveIntegerField()
end = models.PositiveIntegerField()
然后是评论模型。一种常见的设计是使用通用关系,以便注释可以与应用程序中的任何模型一起使用。像这样的东西就足够了:
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 创建评论。检索文章的亮点也应该相当容易实现。
推荐阅读
- jquery - 绘制折线图中的动态数据问题
- windows-subsystem-for-linux - 无法在 WSL 中使用任何 Windows 驱动器
- asynchronous - websocket 意外关闭
- typescript - 如何根据事件名称缩小回调事件类型
- c# - 用 \n 替换特殊字符,但将文本保持在同一“列”中
- azure - 尝试将托管标识与 Azure 服务总线一起使用
- pdf - Tesseract:线检测太敏感
- html - 容器边框和子元素背景之间的小间隙(CHROME)
- python - 从 python 中的数据帧导出到 MS 访问时的编码问题
- python - 在python中,我们如何执行条件操作列表,其中列表的项目或元素是关键字