关注功能
关注是针对于User模型的,一个用户可以关注多个用户,一个用户也可以被多个用户关注,属于多对多关系。而且这个关系的两边是同一个模型,都是User。所以采用一个中间表来实现。
新建一个Follow模型,有两个字段,一个是被关注者,一个是粉丝,两个字段都是User的外键,此时注意需要在字段里填写related_name属性,这个属性的官方解释如下:
意思是related_name是外键的源模型用来获取该模型的方法,因为Follow中两个外键的源模型都是User,这样会引发一个错误,所以通过设置不同的related_name来避免。Follow表设计如下:
class Follow(models.Model):
follow = models.ForeignKey(User, related_name="follow_user")
fan = models.ForeignKey(User, related_name="fan_user")
def __str__(self):
return "follow:{},fan:{}".format(self.follow,self.fan)
follow字段是被关注者,fan字段是粉丝,所以数据表明fan关注了follow。
获取关注者和自己的文章
文章模型很简单,具有一个关键作者的外键。
class Post(models.Model):
user = models.ForeignKey(User)
title = models.CharField(max_length=100)
body = models.TextField()
pub_date = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
所以思路是,先获取登录用户的所有关注者,再从每个关注者获取所有文章,仅仅这个就很难用django的查询语句去实现了,况且还要再加上登录者自己的文章,所以选择用SQL语句去查询。
django提供了 raw 方法来执行原生SQL语句,只需要将原生语句写成字符串,放入raw中就行了
# 关注人的文章
follow_post_list = Post.objects.raw('''select * from main_post where user_id in (
select follow_id from yonghu_follow where fan_id = %s)
union
select * from main_post where user_id = %s
order by (-pub_date)
'''%(user.id, user.id))
注意不要像我这样用 %去传参, 直接写在列表里,raw会自动传进去,已避免SQL注入。
通过 raw 返回的是一个懒查询,类似列表生成器,只有被调用时才会进行查询返回数据。
至此实现只看关注者的功能