6

我在 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 为我做到了。然而,对称选项仅适用于“自”引用字段。

哪个是更好的解决方案?我找不到任何关于它的信息。任何想法表示赞赏 - 谢谢!

4

1 回答 1

3

西蒙,

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

你看过django-friends吗?

于 2011-10-25T13:14:31.613 回答