多对多字段django以两种方式添加关系

Posted

技术标签:

【中文标题】多对多字段django以两种方式添加关系【英文标题】:Many to many field django add the relationship both way 【发布时间】:2017-05-23 05:50:22 【问题描述】:

我正在尝试做一个允许用户关注另一个用户的功能。问题是当我将新用户添加到“关注”时,关注另一个用户的用户也会添加到关注用户的以下列表中。例如,如果用户 a 关注用户 b,我将拥有:

view.py

def follow_test(request):
    name = request.POST.get('name', '')
    user_followed = Dater.objects.get(username=name)
    current_user = Dater.objects.get(id=request.user.id)
    print "Current", current_user.followings.all() # display []
    print "Followed", user_followed.followings.all() # display []
    current_user.followings.add(user_followed)
    print "Current", current_user.followings.all() # display <Dater: b>
    print "Followed", user_followed.followings.all() # display <Dater: a>

model.py

followings = models.ManyToManyField('self', blank=True)

我希望用户 b 只添加到 a 的以下内容中

【问题讨论】:

能否请您也打印输出。 【参考方案1】:

默认情况下,self 上的多对多关系是对称的。如果您不希望这样,请将symmetrical 设置为 False:

followings = models.ManyToManyField('self', blank=True, symmetrical=False)

见the docs

【讨论】:

【参考方案2】:

只需为多对多字段设置related_name="followed_by"。这会将反向映射分配给followed_by

followings = models.ManyToManyField('self', blank=True, symmetrical=False, related_name='followed_by')

【讨论】:

我不太明白您提出的解决方案。我必须设置我的模型吗? 用修改后的模型字段更新了答案。希望有帮助。如果您还有其他问题,请告诉我

以上是关于多对多字段django以两种方式添加关系的主要内容,如果未能解决你的问题,请参考以下文章

在 django 的多对多关系中添加额外的字段

更改模型以添加“通过”关系以订购多对多字段 - Django 1.7 迁移修改

DJANGO:与附加字段的多对多关系

Django多对多关系建立及Form组件

在Django中按关系字段过滤多对多关系

创建多对多表关系的三种方式