Python 实现一个facebook类型的simpler';比如';后端功能
我正在开发一个用Django制作的网站,我想实现一个facebook类型(或任何社交媒体类型)Python 实现一个facebook类型的simpler';比如';后端功能,python,django,django-models,Python,Django,Django Models,我正在开发一个用Django制作的网站,我想实现一个facebook类型(或任何社交媒体类型),比如按钮。我有一个user表和一个post表,我希望用户能够喜欢这些帖子。我对一些特殊的事情感到困惑: 如何将用户信息与喜好绑定,以便一个用户只能喜欢一次 我目前的做法是: 我正在考虑在post表中创建一个新字段,比如post\u likes,其中包含当前喜欢该帖子的用户列表。然后,在呈现“post”模板之前,我必须循环所有用户(在字段post\u likes)检查请求。用户是否喜欢帖子(在vi
,比如
按钮。我有一个user
表和一个post
表,我希望用户能够喜欢这些帖子。我对一些特殊的事情感到困惑:
- 如何将用户信息与喜好绑定,以便一个用户只能喜欢一次李>
- 我正在考虑在
表中创建一个新字段,比如post
,其中包含当前喜欢该帖子的用户列表。然后,在呈现“post”模板之前,我必须循环所有用户(在字段post\u likes
)检查post\u likes
请求。用户
是否喜欢帖子(在views.py中),并将数据发送到模板(将
按钮的ui更改为like
),但这种方法对我来说似乎很幼稚,也很慢。有什么更好的方法李>liked
Post
(实际上它将包含额外的数据,如消息
,作者
,等等),和类似
,即充当Post
和用户
之间的多对多关系:
class Post(models.Model):
total_likes = models.IntegerField(default=0)
likes = models.ManyToManyField(User, through='app.Like')
def like(self, user):
_, created = Like.objects.get_or_create(user=user, post=self)
if created:
self.total_likes += 1
self.save()
@classmethod
def update_likes(cls):
cls.objects.annotate(total=Count('likes')).update(total_likes=F('total'))
class Like(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
post = models.ForeignKey(Post, on_delete=models.CASCADE)
因此,like(…)
函数用于喜欢一篇文章(以用户为参数)。因此,我们可以调用somepost.like(someuser)
。它将获取或创建一个新的对象,如映射到特定post
和特定用户的对象。如果Like
实例已经存在,则不会发生任何事情,否则我们将增加存储Like总数的total\u likes
字段
也许您不希望每次用户喜欢帖子时都更新此计数器:毕竟,它会在服务器上产生一些额外的负载。在这种情况下,如果创建:
部分可以省略,我们应该定期调用Post.update\u likes
。此函数将根据Post
执行聚合,计算喜欢的数量,并更新total_likes
字段
不管你是否经常更新total_likes
,最好是每一篇文章都更新一下总的喜欢次数。由于其他视图、模型等可以(假定开发人员对此要求不太严格)删除类对象。此外,User
s可以被删除,等等。我们对此没有太多控制权。是的,我们可以创建在删除(并创建)了Like
s和User
s后触发的信号,但在计算Like-Like比赛条件的数量时仍然存在问题。因此,我建议定期更新喜欢的数量。通常,您会将喜欢的数量缓存在一个额外的字段中,并立即或不时地更新它。您不必在Python中计算like,但可以通过为此编写查询来实现。