Есть несколько вещей, которые вы должны изменить, чтобы избежать проблем в будущем.
class Objective(models.Model):
initial_date = models.DateField(default=timezone.now, null=False)
Обратите внимание, что вы передаете функцию, а не результат вызова функции default
. Если вы делаете то, что имеете, значение по умолчанию будет меняться при каждом перезапуске веб-сервера. Передача функции по умолчанию установит дату на текущую дату.
class Task(models.Model):
objectives = models.ManyToManyField(Objective, related_name='tasks')
При присвоении имени связи с множественной версией слова код становится более понятным. Теперь, когда вы получаете доступ к task.objectives
, вы знаете, что это коллекция. task.objective
создает впечатление, что он должен быть только один.
По вашему мнению, вам не нужно указывать, что вам нужен только идентификатор. Django выяснит это до тех пор, пока вы передаете экземпляр Queryset. Также будет сделан только один запрос для извлечения данных.
current_objectives = Objective.objects.filter(
initial_date__gte=date(2020,1,1),
expiration_date__lte=date(2020,12,31)
)
tasks = Task.objects.filter(objectives__in=current_objectives).distinct()
form = {'task_list': tasks}
Или вы можете просмотреть взаимосвязь в фильтре.
tasks = Task.objects.filter(
objectives__initial_date__gte=date(2020,1,1),
objectives__expiration_date__lte=date(2020,12,31),
).distinct()
form = {'task_list': tasks}
Тогда ваш шаблон должен выглядеть следующим образом:
{% for task in task_list %}
<table>
<tbody>
<tr>
<td>{{task.id}}</td>
<td>{{task.task}}</td>
<td>{{task.status}}</td>
<td>{{task.objectives.all}}</td>
</tr>
</tbody>
</table>
{% endfor %}
task.objectives
(или task.objective
в вашем текущем коде) - это просто ссылка на экземпляр Manager, а не на саму коллекцию. Вам необходимо получить доступ к .all
, чтобы получить фактические данные.