这可能非常简单,值得 Nelson Muntz 笑一笑,但我正在尝试在各种模型关系中建立多对多的联系。
我有以下模型(为您的享受而简化!):
class Document(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(User, blank=True)
content = models.TextField(blank=True)
private = models.BooleanField(default=False)
class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
friends = models.ManyToManyField(User, symmetrical=False,
related_name='user_friends')
ignored = models.ManyToManyField(User, symmetrical=False,
related_name='user_ignored')
对以下用户进行成像:
- Alice 有 3 个文档,其中 1 个是私有的(意味着只有朋友可以看到)。她是 Bob 的朋友,忽略了 Mallory,并且对 Eve 冷漠(意思是没有存储的关系)。
- 马洛里有两份文件,都是公开的,对每个人都冷漠。
- Bob 有 1 份文件,该文件是公开的,并且对所有人都冷漠。
- 夏娃无视爱丽丝,对马洛里和鲍勃冷漠
搜索文档的用户应提供以下内容:
- Bob 搜索文档应该会看到 6,因为 Alice 已将他加为好友,他可以查看她的私人文档。
- 搜索文档的 Alice 应该看到 4、Bobs 1 和她的 3。她没有看到 Mallory 的公共文档,因为 Alice 忽略了 Mallory。
- 搜索文件的 Mallory 看到 5 个 - Alice 的公开文件,她自己的 2 个和 Bobs 1 个。Alice 忽略她与 Mallory 可以看到的内容无关,只是 Alice 看不到 Mallory 的文档。
- Eve 搜索文档时看到 3 - Mallory 和 Bob 的公共文档,因为她忽略了 Alice。
基本上,我在寻找过滤器以返回我上面描述的查询集时遇到了精神上的挣扎。有人有什么想法吗?
编辑
感谢费迪南德在下面的回答,我能够从他给我的开始就明白我想要的东西。首先,我们想要得到一个与我成为朋友的人的列表,这是通过多对多关系的反向查找:
friendly_authors = self.user.user_friends.all()
获取所有我忽略的人:
my_ignored = UserProfile.objects.get(user=self.user).ignored.all()
获取我可以查看的文档列表 - 可以查看的文档、我的文档或由与我成为朋友但我没有忽略的人编写的文档:
docs = Document.objects.filter(
(Q(viewable=True) | Q(author=self.user) | Q(author__in=friendly_authors))
& ~Q(author__in=my_ignored)
)