Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 实现一个facebook类型的simpler';比如';后端功能_Python_Django_Django Models - Fatal编程技术网

Python 实现一个facebook类型的simpler';比如';后端功能

Python 实现一个facebook类型的simpler';比如';后端功能,python,django,django-models,Python,Django,Django Models,我正在开发一个用Django制作的网站,我想实现一个facebook类型(或任何社交媒体类型),比如按钮。我有一个user表和一个post表,我希望用户能够喜欢这些帖子。我对一些特殊的事情感到困惑: 如何将用户信息与喜好绑定,以便一个用户只能喜欢一次 我目前的做法是: 我正在考虑在post表中创建一个新字段,比如post\u likes,其中包含当前喜欢该帖子的用户列表。然后,在呈现“post”模板之前,我必须循环所有用户(在字段post\u likes)检查请求。用户是否喜欢帖子(在vi

我正在开发一个用Django制作的网站,我想实现一个facebook类型(或任何社交媒体类型)
,比如
按钮。我有一个
user
表和一个
post
表,我希望用户能够喜欢这些帖子。我对一些特殊的事情感到困惑:

  • 如何将用户信息与喜好绑定,以便一个用户只能喜欢一次
我目前的做法是:

  • 我正在考虑在
    post
    表中创建一个新字段,比如
    post\u likes
    ,其中包含当前喜欢该帖子的用户列表。然后,在呈现“post”模板之前,我必须循环所有用户(在字段
    post\u likes
    )检查
    请求。用户
    是否喜欢帖子(在views.py中),并将数据发送到模板(将
    like
    按钮的ui更改为
    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,但可以通过为此编写查询来实现。