Как выделить часть статьи в бэкэнде с помощью django rest framework - PullRequest
0 голосов
/ 31 января 2019

Вот как я создаю свою статью

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

1 Ответ

0 голосов
/ 31 января 2019

Это скорее проектное решение на уровне модели, а не проблема API.Я бы пошел со следующим дизайном БД:

Подсветка модели, в которой хранится ссылка на статью, начальный индекс выделенной части текста и конечный индекс.Итак, что-то вроде этого:

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 вокруг этого дизайна, где клиенты создают блики, отправляя идентификатор статьи, начальный и конечный индексы выделенного текста.Комментарии также могут быть созданы с использованием идентификатора выделения.Получение основных моментов для статьи также должно быть довольно простым в реализации.

...