Django数据库:HASHTAG-FOLLOWER关系中的多对多foregin键

Django数据库:HASHTAG-FOLLOWER关系中的多对多foregin键,django,database,Django,Database,让我们假设我构建了Instagram平台 **我需要快速查找 我有两种型号: class Follower(): hastags = ??? 能力: 要能够获取-所有特定跟随者-hashtags 相反:获取特定hastag的所有追随者 注: 追随者不必有标签 标签只在跟随者添加后才存在 我想我可以把foreginKey放在Hashtag上而不是Follower上,但是这看起来很混乱,因为我主要处理followers而不是Hashtag。 我知道我可以添加一个函数,在follower模型

让我们假设我构建了Instagram平台

**我需要快速查找

我有两种型号:

class Follower():
   hastags = ???
能力:

要能够获取-所有特定跟随者-hashtags

相反:获取特定hastag的所有追随者


注:

追随者不必有标签

标签只在跟随者添加后才存在

我想我可以把foreginKey放在Hashtag上而不是Follower上,但是这看起来很混乱,因为我主要处理followers而不是Hashtag。 我知道我可以添加一个函数,在follower模型中为follower添加hashtag

所以最好的选择是使用从追随者到散列标签的多个标签?如果我错了,请纠正我


例如:

Follower1使用Hashtags:Tag1、Tag2


Follower2使用Hashtags:Tag2、Tag3

是的,您将使用多对多字段

class Follower(models.Model):
   followed_hashtags = models.ManyToManyField('Hashtag', related_name='followers')
要获得某人跟随的所有hashtag,可以使用前向描述符

hashtags = follower.followed_hashtags.all()
cat_hashtag = Hashtag.objects.get(name='cat')
cat_followers = cat_hashtag.followers.all()
要获取hashtag的所有跟随者,可以使用反向描述符

hashtags = follower.followed_hashtags.all()
cat_hashtag = Hashtag.objects.get(name='cat')
cat_followers = cat_hashtag.followers.all()
您还可以使用通过表/模型隐式生成的
,进行更有趣的查找,例如以下计数的摘要:

HashtagFollows = Follower.followed_hashtags.through
counts = HashtagFollows.objects.all().values('hashtag__name').annotate(count=Count())
如果您只有一个追随者ID,则此隐式表也可用于查找:

follower_8s_hashtag_names = HashtagFollows.objects.filter(follower_id=8).values_list('hashtag__name')

并且,如果您需要存储(例如)给定跟随者开始跟随某个标签的时间,请参阅(然后替换隐式贯穿表)。

一个标签后面是否可以跟随多个跟随者?是的,可以在多个跟随者中使用一个标签(他们使用它而不是跟随它)。他能做些什么来确保最好的表现?他应该添加db_index=True吗?through表中的基础外键字段已经被索引了(因为它们是外键)。如果我们将相同的Hashtag添加到同一个Follower 2次,会发生什么?它不会做任何事情吗?除非您自定义through表,否则它将有一个
unique\u约束,因此您不能添加两次hashtag。