Следите за событиями follow/unfollow django

Я создаю своего рода приложение для социальных сетей, где пользователи могут следить за определенными страницами. Я хочу, чтобы менеджеры страниц могли визуализировать своих подписчиков в виде графика за каждый день/неделю или около того. Поэтому я думаю о том, как реализовать следующую систему. На данный момент у меня есть такая модель:

class FollowHistory(models.Model):
    user = models.ForeignKey('User', on_delete=models.CASCADE, related_name="follow_history")
    page = models.ForeignKey('Page', on_delete=models.CASCADE, related_name="follower_history")
    timestamp = models.DateTimeField(auto_now_add=True)
    followed = models.BooleanField()

Когда пользователь нажимает кнопку Follow, я создаю экземпляр с followed = True и меткой времени события. Когда пользователь нажимает кнопку Unfollow, я делаю то же самое, но с followed = False.

Я пытаюсь понять, как запросить данные для страницы, чтобы увидеть, сколько подписчиков у нее было каждый день. До сих пор я пробовал следующее:

FollowHistory.objects.filter(page=page, followed=True)\
.annotate(ts_day=Trunc('timestamp', 'day'))\
.values('ts_day')\
.annotate(followers=Count('id'))

Но это просто дает мне подсчет событий, произошедших за день, так что если я следую и не следую за компанией 10 раз, то это будет считаться 10 раз. Мне нужно только знать к концу дня, следил я за компанией или нет?

Возможно, есть лучшая реализация модели, которую вы могли бы порекомендовать, я открыт для этого тоже. Спасибо!

создайте два запроса:

people_who_unfollowed = FollowHistory.objects.filter(timestamp__year=2022, timestamp__month=03, timestamp__day=12,page=page, followed=False)
people_who_followed   = FollowHistory.objects.filter(timestamp__year=2022, timestamp__month=03, timestamp__day=12,page=page, followed=True)

теперь ваш вывод на 12 марта 2022 года будет таким:

followings = len(people_who_followed) - len(people_who_unfollowed)

или есть another approach:

class FollowHistory(models.Model):
   user = models.ForeignKey('User', on_delete=models.CASCADE, related_name="follow_history")
   page = models.ForeignKey('Page', on_delete=models.CASCADE, related_name="follower_history")
   timestamp = models.DateField(auto_now_add=True)
   counter = models.IntegerField()

когда любой пользователь хочет следовать или не следовать:

today = date.today()
get_or_create_Follow_history_object, created = FollowHistory.objects.get_or_create(timestamp__year=today.year, timestamp__month=today.monnh, timestamp__day=today.day,page=page)
if created == True:
    # here is some logic with created FollowHistory object
    # you need to up or down counter of this model
    # get_or_create_Follow_history_object.counter = get_or_create_Follow_history_object.counter + 1 #(or-1 if unfollow)
    # get_or_create_Follow_history_object.save()
else:
    # this is for object which already exists
    # get_or_create_Follow_history_object.counter = get_or_create_Follow_history_object.counter + 1 #(or-1 if unfollow)
    # get_or_create_Follow_history_object.save()
   

это получит FollowHistory, если она существует и created переменная будет False,

если она не существует, она будет создана, и created переменная будет True

В конце дня у вас будет много объектов FollowHistory, которые будут соответствовать тому, сколько последователей/непоследователей произошло (свойство.counter) и их дата, так что вы можете сделать запрос:

all_follow_history_objects = FollowHistory.objects.filter(page=page, user=user)

и отправьте его на вашу html-страницу, где вы можете вывести все данные в таблицу в цикле for

{% for i in all_follow_history_objects %}
    <p>date: {{i.timestamp}} ---  counter: {{i.counter}}</p>
{% endfor %}
Вернуться на верх