Следите за событиями 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 %}