django 多对多递归关系

Ziq*_*Liu 5 python django

我想在django中实现一个基本的社交网络模型,即follower和follower

class CustomUser(User):
    followers = models.ManyToManyField('self', related_name='followees',
                                       related_query_name='followee')
Run Code Online (Sandbox Code Playgroud)

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

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

Igo*_*kiy 8

@olieidel 是对的,但这里还有一件非常重要的事情,您不应在示例中错过:通常,M2M 关系是对称的。这意味着,如果您将用户 A 设置为用户 B 的关注者,则查询集也会返回用户 B 作为用户 A 的关注者。

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

followers = models.ManyToManyField(
    to='self', 
    related_name='followees', 
    symmetrical=False
)
Run Code Online (Sandbox Code Playgroud)


oli*_*del 5

  1. 不,您不必创建(第二个)跟随者 ManyToMany 字段。这已经通过指定来处理related_name='followees'。在旁注中,无需指定,related_query_name因为它的值related_name默认设置为 的值。

  2. AManyToManyField返回 aRelatedManager允许您对其进行一些类似于 QuerySet 的查询。在您的情况下,您对以下内容感兴趣count()

    custom_user = CustomUser().save()
    
    # add followers etc..
    
    followers_count = custom_user.followers.count()
    followees_count = custom_user.followees.count()
    
    Run Code Online (Sandbox Code Playgroud)

Django Docs 有一些关于多对多关系的很好的例子