I am trying to display a query to a template and I am getting the correct data output but it is being displayed with Queryset<>tags, I believe the reason for this is using .all within my template to make the query but I am unable to figure out how I would display the information with out using .all
models.py
class SectionMeetingDate(models.Model):
section_date = models.DateField()
# time stamps when a cost center is created or updated
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return str(self.section_date)
class SectionMeeting(models.Model):
user = models.CharField(max_length=200)
section_meeting_date = models.ManyToManyField(SectionMeetingDate, related_name='section_meeting_date')
# time stamps when a cost center is created or updated
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return str(self.user)
class CostCenterID(models.Model):
name = models.CharField(max_length=200)
dept_leader = models.CharField(max_length=200, null=True, blank=True)
section_leader = models.ManyToManyField(SectionMeeting, related_name='section_leader')
department_meeting = models.ManyToManyField(DepartmentMeeting, related_name='section_leader')
# time stamps when a cost center is created or updated
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
views.py
def cost_center_id(request, pk):
# provides the name of the section leaders for each cost center ID
names = CostCenterID.objects.get(id=pk)
context = {
'names':names,
}
return render(request, 'DeptSummary/cost_center_id.html', context)
cost_center_id.html
{% for section_leaders in names.section_leader.all %}
<h5>
Section Leader --
<a href="{% url 'section_leader_date' section_leaders.id %}">
{{ section_leaders }}
</a>
-- Total -- {{section_leaders.section_meeting_date.count}}
-- {{section_leaders.section_meeting_date.all}}
</h5>
{% endfor %}
currently my template is displaying:
Section Leader — Albin Ortiz — Total — 1 — <QuerySet [<SectionMeetingDate: 2023-05-08>]>
what I want is:
Section Leader — Albin Ortiz — Total — 1 — 2023-05-08
I have tried rewriting my query a few different ways but am unable to figure out how to display my information without the Queryset tags.
>Solution :
Enumerate over the queryset:
{% for section_leaders in names.section_leader.all %}<h5>
Section Leader -- <a href="{% url 'section_leader_date' section_leaders.id %}">{{ section_leaders }}</a>
-- Total -- {{ section_leaders.section_meeting_date.count }} --
{% for meeting in section_leaders.section_meeting_date.all %} {{ meeting }} {% endfor %}
</h5>{% endfor %}
I would furthermore advice to prefetch the section_leader
s and their section_meeting_date
s to prevent N+1 problems:
from django.shortcuts import get_object_or_404
def cost_center_id(request, pk):
# provides the name of the section leaders for each cost center ID
names = get_object_or_404(
CostCenterID.objects.prefetch_related(
'section_leader__section_meeting_date'
),
pk=pk,
)
context = {
'names': names,
}
return render(request, 'DeptSummary/cost_center_id.html', context)
Note: It is often better to use
get_object_or_404(…)
[Django-doc],
then to use.get(…)
[Django-doc] directly. In case the object does not exists,
for example because the user altered the URL themselves, theget_object_or_404(…)
will result in returning a HTTP 404 Not Found response, whereas using
.get(…)
will result in a HTTP 500 Server Error.