我有以下型號:選擇所有Django的外鍵模式,如果條件或部分,如果其他條件
class Project(models.Model):
title = models.CharField(max_length=75)
description = models.CharField(max_length=250)
project_collaborators = models.ManyToManyField(User)
...
class Node(models.Model):
title = models.CharField(max_length=75)
collaborators = models.ManyToManyField(User)
project = models.ForeignKey(Project)
我想要做的是選擇的所有項目,其中一個用戶是project_collaborator,以及所有與該項目相關聯的節點,並且還選擇用戶是項目內節點上的協作者的所有項目,但是每個項目中只選擇該用戶是協作者的節點。
用戶可能是project_collaborator以及節點上的協作者,但是這應該只返回項目/節點的一個實例。
到目前爲止我所得到的最接近的是Project.objects.filter(Q(node__collaborators=user) | Q(project_collaborators=user)).distinct()
,但這並不完全符合我的願望。
編輯:解我用
我開始與這views.py讓用戶將與相關聯的所有項目:
projects = Project.objects.select_related().filter(Q(project_collaborators=request.user) | Q(canvas__collaborators=request.user)).distinct()
然後在模板中我所做的:
{% for project in projects %}
{{ project.title }}
<ul>
{% for node in project.node_set.all %}
{% if request.user in project.project_collaborators.all or request.user in node.collaborators.all %}
<li>{{ node.title }}</li>
{% endif %}
{% endfor %}
</ul>
<br />
{% endfor %}
這使我可以打印出所有節點,如果用戶是項目協作者,或者只有特定節點,如果他們只是節點協作者,同時仍然打印出所有項目嘿與之相關。
你想項目或節點?因爲如果在第二種情況下,您只希望Node的用戶是合作者!我們將不得不回顧項目的筆記清單!否則,如果我們回顧項目,它會回顧所有的筆記!不僅僅是用戶可以訪問的那些! –
我不認爲你可以在單個ORM調用中完成所有這些工作。我將首先創建選擇所需數據的單個語句,然後查看組合這些語句的方法。 – Brandon