我在 Django 中找到了两种实现对称友谊系统的方法(你是我的朋友,所以我也是你的朋友):
正如文档中所建议的:
class UserProfile(models.Model):
friends = models.ManyToManyField(User, related_name='friends')
现在,我想通过一个 select_related-query 获得所有“友好”用户和用户配置文件模型(应该是反向连接查找):
profiles = UserProfile.objects.filter(user__in=request.user.get_profile().friends.all()).select_related()
我查询用户配置文件,因为这样,我可以使用 select_related() 并且所有相关对象都被缓存。
另一方面,我可以定义我的模型,将friends字段引用为“self”,如下所示:
class UserProfile(models.Model):
friends = models.ManyToManyField('self')
现在,我的 select_related 朋友查找看起来像这样:
profiles = this_user.get_profile().friends.all().select_related()
我总是需要用户对象和它的相关配置文件:第二种方法在通过 select_related() 进行反向查找时要简单得多,但实际上是相同的。然而,通过使用“self”作为字段引用,Django 为我处理了对称的友谊。因此,我不必手动在数据库中为每个友谊创建两个条目。Django 为我做到了。然而,对称选项仅适用于“自”引用字段。
哪个是更好的解决方案?我找不到任何关于它的信息。任何想法表示赞赏 - 谢谢!