Django朋友作为多对多字段 - 更好地在现场存储User或UserProfile(self)?

Sim*_*ger 6 django many-to-many user-profile

我在Django 找到了两种实现对称友谊系统的方法(你是我的朋友,所以我也是你的朋友):

正如文档中所建议的那样:

class UserProfile(models.Model):
    friends = models.ManyToManyField(User, related_name='friends')
Run Code Online (Sandbox Code Playgroud)

现在,我想让所有"友好"的用户和用户配置模型具有一个select_related-query,如此(应该是反向连接查找):

profiles = UserProfile.objects.filter(user__in=request.user.get_profile().friends.all()).select_related()
Run Code Online (Sandbox Code Playgroud)

我查询userprofile,因为这样,我可以使用select_related()并缓存所有相关对象.

另一方面,我可以将引用friends字段的模型定义为"self",如下所示:

class UserProfile(models.Model):
    friends = models.ManyToManyField('self')
Run Code Online (Sandbox Code Playgroud)

现在,我的select_related朋友查找看起来像这样:

profiles = this_user.get_profile().friends.all().select_related()
Run Code Online (Sandbox Code Playgroud)

我总是需要用户对象和它的相关配置文件:第二种方法通过select_related()反向查找更简单,但实际上是相同的.然而,通过使用"self"作为场参考,Django为我处理了对称的友谊.因此,我不必手动在数据库中为每个友谊创建两个条目.Django为我做到了这一点.但是,对称选项仅适用于"自"引用字段.

哪个更好的解决方案?我找不到任何关于它的东西.任何想法赞赏 - 谢谢!

ApP*_*PeL 3

西蒙,

有时最好使用现有的插件,而不是尝试重新发明轮子。

你看过django-friends吗?

  • 嗯,是的,我知道了,谢谢;还有 django-simple-friends ([link](https://github.com/muhuk/django-simple-friends)),但是实现这个功能并没有那么多工作,我更确切地知道发生了什么。这两个软件包的功能都非常广泛,但有关如何使用它们的文档却非常薄弱。此外,这两个应用程序都创建了额外的模型 - 为了简单起见,我宁愿使用 **一个** 多对多字段,并让 Django 处理其余的事情。 (2认同)