鑒于模型
class TaskGroup(models.Model):
name = models.CharField(max_length=256)
class Task(models.Model):
name = models.CharField(max_length=256)
group = models.ForeignKey(TaskGroup, on_delete=models.CASCADE)
completed = models.BooleanField(default=False)
completed_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
和串列視圖
class TaskGroupListView(ListView):
model = TaskGroup
我想顯示具有相應任務的任務組串列。問題是 - 我只想顯示尚未完成或已由用戶完成的任務,或者如果用戶作為屬性user.type == "ADMIN"集顯示所有組和所有任務。
現在我有一個看起來像這樣的模板:
{% for taskgroup in object_list %}
<h1>{{ taskgroup.name }}</h1>
<ul>
{% for task in taskgroup.task_set.all %}
<li>{{ task.name }}</li>
{% endfor %}
</ul>
{% endfor %}
我知道我可以通過覆寫以下內容來修改串列視圖的查詢集get_queryset:
def get_queryset(self):
if self.request.user == "ADMIN":
return TaskGroup.objects.all()
else:
...
但我不確定如何過濾else 子句中 sTask上的關系TaskGroup。
我已經考慮過為Task它創建一個管理器子類,它可以基于過濾器.completed和.completed_by我可以在模板中使用,但這似乎違背了 Django 的哲學 - 我想將所有邏輯保留在視圖中(這可能有點偏離標記所以請糾正我,自從我接觸 django/閱讀兩勺 django 以來已經有一段時間了)。
有沒有一些慣用的方法來做到這一點?我應該完全放棄 ListView 并撰寫一些自定義邏輯嗎?這里的任何指導都是有幫助的。謝謝。
uj5u.com熱心網友回復:
您可以prefetch_related與Prefetch使用自定義過濾查詢集的 a一起使用,如下所示:
from django.db.models import Prefetch, Q
def get_queryset(self):
if self.request.user.is_admin:
return TaskGroup.objects.all()
return TaskGroup.objects.prefetch_related(
Prefetch(
'task_set',
queryset=Task.objects.filter(Q(completed=False) | Q(completed_by=self.request.user))
)
)
這將得到所有TaskGroup帶有相關Taskss (in task_set)的s,這些s被那些尚未完成或由當前用戶完成的過濾。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/365348.html
標籤:Python 姜戈 django 模型 django-queryset
上一篇:比較同一作業簿中的兩張作業表
