django 实现关注功能以及只看关注者功能

关注功能

        关注是针对于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 返回的是一个懒查询,类似列表生成器,只有被调用时才会进行查询返回数据。

            至此实现只看关注者的功能


  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值