Django中的多对多查找

Django中的多对多查找,django,django-models,many-to-many,lookup,relationship,Django,Django Models,Many To Many,Lookup,Relationship,这可能是侮辱性的简单,值得纳尔逊·蒙茨笑一笑,但我真的有一个脑死的时刻,试图在各种模型关系中建立多对多的联系 我有以下型号(简化版供您欣赏!): 想象一下以下用户: Alice有3个文档,其中1个是 私人的(意思是只有朋友才能看到) 它)。她和鲍勃是朋友,是吗 漠视马洛里,漠不关心 接近夏娃(意味着没有储存 关系) 马洛里有两份文件,都是公开的 对每个人都漠不关心 Bob有一个公开的文档 也对"台独"漠不关心, 各位 伊芙不理爱丽丝,她很生气 对马洛里和鲍勃漠不关心 搜索文档的用户应提供以下

这可能是侮辱性的简单,值得纳尔逊·蒙茨笑一笑,但我真的有一个脑死的时刻,试图在各种模型关系中建立多对多的联系

我有以下型号(简化版供您欣赏!):

想象一下以下用户:

  • Alice有3个文档,其中1个是 私人的(意思是只有朋友才能看到) 它)。她和鲍勃是朋友,是吗 漠视马洛里,漠不关心 接近夏娃(意味着没有储存 关系)
  • 马洛里有两份文件,都是公开的 对每个人都漠不关心
  • Bob有一个公开的文档 也对"台独"漠不关心, 各位
  • 伊芙不理爱丽丝,她很生气 对马洛里和鲍勃漠不关心
搜索文档的用户应提供以下信息:

  • Bob搜索文档时应 见第6页,因为艾丽斯已经和他交上了朋友 他可以私下看她 文件
  • Alice搜索文档时应 见第四章,第一章和第三章。她没有 参见马洛里的公开文件 爱丽丝忽视了马洛里
  • Mallory搜索文档 5-艾丽丝的公共电话,她自己的2 和Bobs 1。艾丽丝不理她没有理由 关于马洛里能看到的,只是 爱丽丝没有看到马洛里的 医生
  • Eve搜索文档请参见3- 马洛里和鲍勃的公开文件 她忽视了爱丽丝
基本上,我一直在努力找出返回上述查询集的过滤器。有人有什么想法吗

编辑

多亏了费迪南德下面的回答,从他给我的开始,我就能够实现我想要的。 首先,我们想得到一份与我交朋友的人的名单,这是通过多对多关系进行的反向查找:

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)
)

这有点棘手,也许你正在寻找这样的东西:

>>> from django.db.models import Q
>>> me = User.objects.get(pk=1)
>>> my_friends = UserProfile.objects.get(user=me).friends.all()
>>> docs = Document.objects.filter(
...     Q(author=me) | (
...         Q(author__in=my_friends)
...         & ~Q(author__userprofile__ignored=me)
...     )
... )
这将生成以下SQL(我对原始输出进行了一些格式化):


感谢您的帮助,您为我提供了所需的一切,使我能够完成我想要返回的内容+1,以获得清晰的问题描述:)
>>> from django.db.models import Q
>>> me = User.objects.get(pk=1)
>>> my_friends = UserProfile.objects.get(user=me).friends.all()
>>> docs = Document.objects.filter(
...     Q(author=me) | (
...         Q(author__in=my_friends)
...         & ~Q(author__userprofile__ignored=me)
...     )
... )
SELECT "myapp_document".*
FROM "myapp_document" WHERE (
    "myapp_document"."author_id" = %s
    OR (
        "myapp_document"."author_id" IN (
            SELECT U0."id" FROM "myapp_user" U0
            INNER JOIN "myapp_userprofile_friends" U1
                ON (U0."id" = U1."user_id")
            WHERE U1."userprofile_id" = %s
        )
        AND NOT (
            "myapp_document"."author_id" IN (
                SELECT U2."user_id" FROM "myapp_userprofile" U2
                INNER JOIN "myapp_userprofile_ignored" U3
                    ON (U2."id" = U3."userprofile_id")
                WHERE U3."user_id" = %s
            )
            AND "myapp_document"."author_id" IS NOT NULL
        )
    )
)