如何使社交媒体的逻辑高效传递?

问题描述 投票:0回答:1

我想做类似于Twitter的事情,在其中,您在Feed中关注的人的最新帖子都出来了,这些帖子就会出现。这些是我的关系:

from django.db import models
from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    bio = models.TextField(max_length=300, blank=True)
    modified = models.DateTimeField(auto_now=True)

class Post(models.Model):
    user = models.ForeignKey(User,related_name="posts", on_delete=models.CASCADE)

    content = models.TextField(max_length=300)
    created = models.DateTimeField(auto_now=True)

class Follow(models.Model):
    follower = models.ForeignKey(User, related_name="following", on_delete=models.CASCADE)
    following = models.ForeignKey(User, related_name="followers", on_delete=models.CASCADE)

    def unicode(self):
        return "{} follows {}".format(self.follower, self.following)

我正在寻找一种在处理大量数据时将非常有效的过滤器。

我需要怎么做才能从我的关注者那里获取帖子,然后按最新顺序对它们进行排序?

django django-models
1个回答
0
投票

如果您更改模型以提供自己的custom user model,并且将以下/从属关系与非对称ManyToManyField建立关系,则可以大大简化模型

from django.contrib.auth.models import AbstractUser


class User(AbstractUser):

    following = models.ManyToManyField('self', related_name='followers', symmetrical=False)

    bio = models.TextField(max_length=300, blank=True)
    modified = models.DateTimeField(auto_now=True)


class Post(models.Model):
    user = models.ForeignKey(User, related_name="posts", on_delete=models.CASCADE)

    content = models.TextField(max_length=300)
    created = models.DateTimeField(auto_now=True)

在您的设置中

AUTH_USER_MODEL = 'app.User'

现在在您的视图中,您可以轻松查询用户关注的用户

request.user.following.all()

并查询该用户关注的所有用户的帖子

Post.objects.filter(user__followers=request.user).order_by('-created')
© www.soinside.com 2019 - 2024. All rights reserved.