django多对多的递归关系

时间:2017-09-17 19:29:18

标签: python django

我想在django中实现一个基本的社交网络模型,即粉丝和追随者

class CustomUser(User):
    followers = models.ManyToManyField('self', related_name='followees',
                                       related_query_name='followee')

以上就是我定义的内容。我认为这就足够了,因为manytomany字段提供了回溯查询。我是否还需要创建一个追随者ManyToMany提交?

并且任何人都可以帮助编写如何获得关注者和关注者数量的函数,以及关注者列表和关注者列表。我是django的新手所以我对多对多领域感到困惑

2 个答案:

答案 0 :(得分:2)

  1. 不,您不必创建(第二个)跟随ManyToMany字段。已经通过指定related_name='followees'来处理这个问题。在旁注中,没有必要指定related_query_name,因为默认情况下其值设置为related_name的值。

  2. ManyToManyField返回RelatedManager,允许您对其进行一些类似于QuerySet的查询。在您的情况下,您对count()

    感兴趣
    custom_user = CustomUser().save()
    
    # add followers etc..
    
    followers_count = custom_user.followers.count()
    followees_count = custom_user.followees.count()
    
  3. Django文档对于ManyToMany关系有some nice examples

答案 1 :(得分:1)

@olieidel是对的,但这是一个非常重要的事情,你不应该错过你的例子:通常,M2M关系是对称的。这意味着,如果您将用户A设置为用户B的关注者,则查询集将用户B作为用户A的关注者返回。

您可以通过向字段添加symmetrical=False选项来避免此类行为:

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