#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