Как я могу сделать 'view_count' в django-rest-framework? - PullRequest
0 голосов
/ 21 мая 2019

Спасибо вам все время. Я спрошу. (Извините за то, что я не очень хорошо знаю английский)

Я использую реагирование в качестве внешнего интерфейса, поэтому я только запустил инфраструктуру отдыха Django.

но django-rest-framework меня смущает, поэтому я спрашиваю.

В качестве простого примера я хочу автоматически увеличивать view_count, когда я нажимаю show page in crud.

Какую функцию я должен написать в app_name / api / views.py?

вот мой код ..

# notice/models.py

from django.db import models

# Create your models here.
class Notice(models.Model):
  title = models.CharField(max_length=120)
  description = models.TextField()
  view_count = models.IntegerField(default=0)

  def __str__(self):
    return self.title
# notice/api/views.py

from rest_framework import viewsets
from notice.models import Notice
from .serializers import NoticeSerializer
from django.http import JsonResponse

class NoticeViewSet(viewsets.ModelViewSet):
  serializer_class = NoticeSerializer
  queryset = Notice.objects.order_by('title')
# notice/api/serializers.py

from rest_framework import serializers
from notice.models import Notice

class NoticeSerializer(serializers.ModelSerializer):
  class Meta:
    model = Notice
    fields = ('id','title','description','view_count')

1 Ответ

1 голос
/ 21 мая 2019

Вы добавили бы приращение в метод NoticeViewSet.retrieve().Это метод представления, вызываемый при извлечении одного объекта, поэтому он имеет смысл.Вы также можете добавить это в метод представления list, но в зависимости от размера набора запросов он может работать довольно медленно.

class NoticeViewSet(viewsets.ModelViewSet):
    serializer_class = NoticeSerializer
    queryset=Notice.objects.order_by('title')

    def retrieve(self, request, *args, **kwargs):
        obj = self.get_object()
        obj.view_count = obj.view_count + 1
        obj.save(update_fields=("view_count", ))
        return super().retrieve(request, *args, **kwargs)

Если вы хотите также подсчитывать просмотры при отображении Уведомлений, используйте этокласс:

class NoticeViewSet(viewsets.ModelViewSet):
    serializer_class = NoticeSerializer
    queryset=Notice.objects.order_by('title')

    def retrieve(self, request, *args, **kwargs):
        obj = self.get_object()
        obj.view_count = obj.view_count + 1
        obj.save(update_fields=("view_count", ))
        return super().retrieve(request, *args, **kwargs)

    def list(self, request, *args, **kwargs):
        # You could also increment the view count if people see the `Notice` in a listing.
        queryset = self.filter_queryset(self.get_queryset())
        for obj in queryset:
            obj.view_count = obj.view_count + 1
            obj.save(update_fields=("view_count", ))
        return super().list(request, *args, **kwargs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...