我目前正在尝试使用Django构建Web应用程序Todo任务管理器,因为我发现最好的学习方法是动手,但我遇到了一个问题,我真的不知道Django是什么这样做的方式..
目前,我的项目中有两个应用程序,一个是“列表”,第二个是“任务”,我的问题是在前端,我需要显示不同的列表并将它们关联的任务与每个列表相关。到目前为止,我已经设法通过使用外键为我的任务提供列表ID并将“任务”模型导入到“列表”的views.py中,以可视方式获得结果,然后对views.py中的任务进行查询列表应用程序,以便我可以在前端遍历它们,但由于它们都是相互依赖的,我觉得我现在正在制作法兰克斯坦应用程序
你们将如何处理这种情况?
ps:这是我的上下文代码摘录
from tasks.models import Task
def lists_view(request):
lists = List.objects.all()
tasks = Task.objects.all()
print("The request: ", request)
context = {
'lists': lists,
'tasks': tasks,
}
for list in lists:
print("List: ", list)
return render(request, 'lists/lists.html', context)
def list_view(request, pk):
list = List.objects.get(id=pk)
tasks = Task.objects.all()
print(request)
context = {
'list': list,
'tasks': tasks,
}
return render(request, 'lists/list.html', context)
还有html:
{% for list in lists %}
<h1><a href="{% url 'list-detail' list.id %}">{{ list.title|title }}</a></h1>
<ul>
{% for task in tasks %}
{% if task.list.id == list.id%}
<li><a href="{% url 'task-detail' task.id %}">{{ task.title|capfirst }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% endfor %}
答案 0 :(得分:1)
首先,您真的需要两个独立的应用程序吗?列表中是否会包含任务以外的其他东西,以至于您需要将这些东西分开?您可能可以在单个应用程序中将List和Task放在相同的mode.py中。
第二,在这种情况下,您将具有一些相互联系。没关系。并非一切都需要独立且独立。
现在,您的模型是什么样的?
如果列表中有很多任务,那么您应该具有提到的ForeignKey。这样的东西(简化):
class List(models.Model):
title = models.CharField(max_length=100)
class Task(models.Model):
title = models.CharField(max_length=100)
list = ForeignKey(List, on_delete=models.CASCADE, related_name='tasks')
现在您可以简化视图:
from .models import List
def lists_view(request):
lists = List.objects.all()
context = {
'lists': lists,
}
return render(request, 'lists/lists.html', context)
def list_view(request, pk):
list = List.objects.get(id=pk)
context = {
'list': list,
}
return render(request, 'lists/list.html', context)
注意:上面的查询集应使用prefetch_related()进行优化,以减少对db的调用次数 所以
List.objects.prefetch_related('tasks').all()
和
List.objects.prefetch_related('tasks').get(id=pk)
您可以在模板中执行以下操作:
{% for list in lists %}
<h1><a href="{% url 'list-detail' list.id %}">{{ list.title|title }}</a></h1>
<ul>
{% for task in list.tasks %}
<li><a href="{% url 'task-detail' task.id %}">{{ task.title|capfirst }}</a></li>
{% endfor %}
</ul>
{% endfor %}