Django listview filter related field lookup by date

Я хочу получить только элементы моей модели VM, связанные с моей моделью Hypervisor на основе текущей даты, но когда он находит их, я получаю все элементы, связанные с родительской моделью

Мои модели

class Hypervisor(models.Model):
    name = models.CharField(max_length=200)

class VM(models.Model):
    hypervisor = models.ForeignKey(Hypervisor, on_delete=models.CASCADE)
    name = models.CharField(max_length=200)
    cpu = models.CharField(max_length=200)
    ram = models.CharField(max_length=200)
    disk = models.CharField(max_length=200)
    date = models.DateField(null=True)

Мое мнение

class vm(LoginRequiredMixin, ListView):
    model = Hypervisor
    template_name = 'vm_list_original.html'
    ordering = ['name']

    def get_queryset(self, *args, **kwargs):
        return Hypervisor.objects.filter(vm__date=datetime.today().strftime('%Y-%m-%d')).distinct()

DDBB

sqlite> select * from budget_vm;
280|TC-CLINDE1-HARD001|4|8192|80|2022-09-01|254
281|TC-CLINDE1-HARD001|4|8192|80|2022-09-02|251

Мой шаблон

<tbody>
  {% for hyper in object_list %}
      <tr>
      <td>{{ hyper.name }}</td>
      <td>
        {% for vm in hyper.vm_set.all %}
                    {{ vm.name }}
        {% endfor %}
      </td>
      </tr>
  {% endfor %}
</tbody>

Результат enter image description here

Вам нужно отфильтровать связанные элементы также с помощью Prefetch объекта [Django-doc], так:

from django.utils.timezone import now


class vm(LoginRequiredMixin, ListView):
    model = Hypervisor
    template_name = 'vm_list_original.html'
    ordering = ['name']

    def get_queryset(self, *args, **kwargs):
        today = now().date()
        return (
            super()
            .get_queryset(*args, **kwargs)
            .filter(vm__date=today)
            .prefetch_related(
                Prefetch('vm_set', queryset=VM.objects.filter(date=today))
            )
            .distinct()
        )
Вернуться на верх