Как настроить связь между двумя приложениями в Django? - PullRequest
0 голосов
/ 10 января 2019

В настоящее время я пытаюсь создать диспетчер задач Todo для веб-приложения с помощью Django, так как считаю, что лучший способ научиться - это испачкать руки, но я столкнулся с проблемой и не знаю, что такое Django. способ сделать это ..

На данный момент у меня есть два приложения в моем проекте, одно - «списки», а второе - «задачи», и моя проблема в том, что на внешнем интерфейсе мне нужно показать разные списки и связать их с задачами, которые связанные с каждым списком. До сих пор мне удалось получить результат визуально, указав идентификатор списка своих задач с использованием внешнего ключа и импортировав модель «Задача» в 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 голосов
/ 10 января 2019

Во-первых, вам действительно нужно 2 отдельных приложения? Будут ли списки содержать вещи, отличные от задач, которые настолько различны, что вам нужно выделять эти вещи? Возможно, вы могли бы поместить List и Task в один и тот же modely.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 (), чтобы уменьшить количество вызовов до дБ. Так

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 %}
...