Как реализовать эту функцию?

У меня есть модель Contact

class Contact(models.Model):

    name = models.CharField(max_length=255)
    phone = models.CharField(max_length=255)
    appearance = models.PositiveIntegerField(default=0)

    def get_appear(self):
        self.appearance += 1

где appearance - сколько времени я просматриваю эту конечную точку

мой views.py имеет вид :

class ContactView(generics.RetrieveAPIView):
    queryset = Contact.objects.all()
    serializer_class = ContactIdSerializer


    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        instance.get_appear()
        serializer = self.get_serializer(instance)
        return Response(serializer.data)

serializers.py:

class ContactIdSerializer(serializers.ModelSerializer):

    class Meta:
        model = Contact

        fields = ['id', 'name', 'phone', 'address', 'appearance']

Проблема в том, что когда я захожу на свой id :

http://127.0.0.1:8000/api/v1/contacts/3/

каждый раз appearance должен увеличиваться на 1, но это значение всегда равно 1

и значение появления в db всегда равно 0

Решается добавлением instance.save()

Вы должны сохранить элемент:

class Contact(models.Model):
    # …

    def get_appear(self, save=True):
        self.appearance += 1
        if save:
            self.save(update_fields=('appearance',))

или если могут возникнуть условия гонки:

from django.db.models import F

class Contact(models.Model):
    # …

    def get_appear(self, save=True):
        old = self.appearance
        if save:
            self.appearance = F('appearance') + 1
            self.save(update_fields=('appearance',))
        self.appearance = old + 1

В результате будет получен запрос, который выглядит следующим образом:

UPDATE contact
SET appearance = appearance + 1
WHERE pk = pk

поэтому, если несколько запросов выполняются почти одновременно, он будет каждый раз увеличивать столбец appearance.

Вернуться на верх