Как реализовать эту функцию?
У меня есть модель 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
.