Запрос данных, связанных с помощью внешнего ключа

#django

#django

Вопрос:

У меня есть 2 модели, связанные с «Проектом» и «Событием». Event имеет FK для Project

Я хочу вернуть все события, которые связаны только с проектом.

У меня есть базовое представление, которое возвращает конкретный проект, и я пытаюсь включить список событий в это представление.

 def show_project_details(request,project_id):
    today = now().date()
    project = Project.objects.get(pk=project_id)
    events = Event.objects.event_list = Event.objects.filter(event_date__gte=today).order_by('event_date')
    events_list = Event.objects.get(project_name_id=project_id)
    form = ProjectForm(request.POST or None, instance=project)

    return render(request, 'pages/project_details.html', {"project": project, "form": form, "events": events, 'events_list':events_list})
 

но он возвращает

Event matching query does not exist.

Есть идеи?

Комментарии:

1. Отредактируйте вопрос, чтобы показать ваши модели.

2. отображение вашей модели для события и проекта может лучше помочь диагностировать необходимый запрос

Ответ №1:

чтобы получить все события, связанные с конкретным проектом, используйте

 project = Project.objects.get(pk=project_id)
events = project.event_set.filter(event_date__gte=today).order_by('event_date')
 

таким образом, полное представление уменьшится до

 def show_project_details(request,project_id):
    today = now().date()
    project = Project.objects.get(pk=project_id)
    events = project.event_set.filter(event_date__gte=today).order_by('event_date')
    form = ProjectForm(request.POST or None, instance=project)

    return render(request, 'pages/project_details.html', {"project": project, "form": form, "events": events})
 

Ответ №2:

Ответ Брайана Обота — очень хорошее решение вашей реальной проблемы.


Чтобы ответить на ваш вопрос, почему вы получаете эту конкретную ошибку в своем коде:

Запрос, соответствующий событию, не существует.

Поскольку вы (пока) не предоставили свои модели, я могу только догадываться, что ошибка возникает для этой строки кода:

 events_list = Event.objects.get(project_name_id=project_id)
 

objects.get всегда будет выдавать сообщение об ошибке, если он точно не найдет 1 отдельный объект. Для выборки данных, которые могут возвращать 0 для многих результатов (как в случае обычных обратных отношений внешнего ключа), вы должны использовать filter .

Ваш текущий код должен работать, если вы измените приведенную выше строку на:

 events_list = Event.objects.filter(project_name_id=project_id)
 

Это действительно вернет список (фактически набор запросов), который также может быть пустым.


С точки зрения производительности / количества операторов, выполняемых в базе данных:

Оба способа ( project.event_set и Event.objects.filter ) приведут к дополнительным инструкциям для базы данных.

Если вы хотите избежать этого и извлекать все при извлечении данных проекта, вам придется работать с аннотациями.

Пока у вас не возникает никаких проблем, можно оставить все как есть. Если вам интересно углубиться в эту область, прочитайте больше: https://docs.djangoproject.com/en/3.2/ref/models/querysets/#annotate