如何在Django中设置两个应用之间的通信?

时间:2019-01-10 12:15:36

标签: django django-models django-views

我目前正在尝试使用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 %}

1 个答案:

答案 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 %}