Django фильтрация в отфильтрованной реляционной модели

У МЕНЯ ЕСТЬ ЭТИ МОДЕЛИ:



# Create your models here.
import datetime

from django.conf import settings
from django.db import models
from django.db.models import Q
from django.utils import timezone
from django.contrib.auth.models import User

# Create your models here.

from datetime import  date

class Docs(models.Model):
    doc_id = models.CharField ('ID документа', max_length=200,null=True,  unique=True)
    doc_title = models.CharField ('Название документа', max_length=200,null=True)
    hyp_name = models.URLField('Ссылка на документ')
    update_date = models.DateField (auto_now=True,verbose_name='Дата обновления документа')
    date_per = models.IntegerField('Срок действия прохождения')

    def __str__(self):
        return self.doc_id

    class Meta:
        verbose_name = 'Документ'
        verbose_name_plural = 'Документы'


class Curicls(models.Model):
    curic_id = models.CharField ('ID курикулы', max_length=100, null=True,unique=True)
    cur_title = models.CharField ('Название курикулы', max_length=100, null=True)
    doc_id = models.ManyToManyField(Docs)


    def __str__(self):
        return self.curic_id

    class Meta:
        verbose_name = 'Курикула'
        verbose_name_plural = 'Курикулы'


class Rolesl(models.Model):
    LEARN = 'A'
    CHECK = 'B'
    RANG_DIF = [
        (CHECK, "ОЗНАКОМИТЬСЯ"),
        (LEARN, "ИЗУЧИТЬ")
    ]

    role_name = models.CharField('Название роли', max_length=100, unique=True)
    cur_id = models.ManyToManyField (Curicls, max_length=200, verbose_name='ID курикулы')
    rang = models.CharField(max_length=1, choices=RANG_DIF, default='', verbose_name='Ранг')

    def __str__(self):
        return self.role_name

    class Meta:
        verbose_name = 'Роль'
        verbose_name_plural = 'Роли'



class Emp(models.Model):

    emp_name = models.OneToOneField(User, on_delete= models.CASCADE)
    per_no = models.IntegerField('Pers.No.')
    last_name = models.CharField('Last Name', max_length=50)
    first_name = models.CharField('First Name', max_length=50)
    emp_mail = models.EmailField('Email', max_length=100)
    roles_name = models.ManyToManyField(Rolesl)

    def __str__(self):
        return str(self.emp_name)

    class Meta:
        verbose_name = 'Работник'
        verbose_name_plural = 'Работники'


class Progress(models.Model):
    mail_sent = 'M'
    done = 'D'
    STAT = [
        (mail_sent, "Уведомлен"),
        (done, "Прошел"),
    ]
    emp_name = models.ForeignKey(Emp, on_delete=models.CASCADE)
    doc_title = models.ForeignKey(Docs, on_delete=models.CASCADE)
    date_create = models.DateField(auto_now_add=True, verbose_name='Дата уведомления прохождения')
    date_update = models.DateField(verbose_name='Дата прохождения')
    status = models.CharField(max_length=1, choices=STAT, default='')

    def __str__(self):
        return str(self.pk)

    class Meta:
        verbose_name = 'Прогресс'
        verbose_name_plural = 'Прогресс'


Я ХОЧУ ПОЛУЧИТЬ РОЛИ (МОДЕЛЬ РОЛЕЙ) УЧЕБНЫЕ ПЛАНЫ И ДОКУМЕНТЫ, КОТОРЫЕ НАЗНАЧЕНЫ ТЕКУЩЕМУ ПОЛЬЗОВАТЕЛЮ. BUUT

В МОДЕЛИ ПРОГРЕССА У НАС ЕСТЬ ПРОГРЕСС ПОЛЬЗОВАТЕЛЕЙ ПО НАЗНАЧЕННЫМ ДОКУМЕНТАМ. 1)ЕСЛИ ДОКУМЕНТ ВЫПОЛНЕН, ТО ЕГО НЕ НУЖНО ОТОБРАЖАТЬ

>2)ЕСЛИ ДОКУМЕНТ ОБНОВЛЕН, ТО НЕОБХОДИМО ПЕРЕДАТЬ ЕГО

  1. ЕСЛИ ДАТА ИСТЕКЛА ("date_per "+ ДАТА ПРОХОЖДЕНИЯ)<СЕЙЧАС ТО НЕОБХОДИМО ПРОЙТИ ЭТО

У МЕНЯ ЕСТЬ ЗАПРОС, КОТОРЫЙ ВЫВОДИТ ВСЕ ДОКУМЕНТЫ РОЛИ И УЧЕБНОЙ ПРОГРАММЫ, НАЗНАЧЕННЫЕ ПОЛЬЗОВАТЕЛЮ, НО КАК ОТОБРАЗИТЬ ЭТИ ДОКУМЕНТЫ В СООТВЕТСТВИИ С ЭТИМИ ТРЕМЯ КРИТЕРИЯМИ?

МОЖНО ЛИ ОТФИЛЬТРОВАТЬ ОТФИЛЬТРОВАННУЮ МОДЕЛЬ?

ПРОСМОТР В ШАБЛОНЕ: enter image description here

Emp.objects.prefetch_related(Prefetch("roles_name__cur_id__doc_id", Docs.objects.all()))

В ПРИНЦИПЕ, Я ДУМАЮ, ЧТО ВАМ НУЖНО СОЗДАТЬ Q-ФИЛЬТР ДЛЯ СВЯЗАННОГО ОБЪЕКТА, НО ВОТ В ЧЕМ ПРОБЛЕМА, ОН ДОЛЖЕН ФИЛЬТРОВАТЬ ТОЛЬКО ОБЪЕКТЫ, КОТОРЫЕ ИМЕЮТ ОПРЕДЕЛЕННЫЙ (ТЕКУЩИЙ ПОЛЬЗОВАТЕЛЬ), А НЕ ВСЕ.

ЭТО НЕ РАБОТАЕТ ПРАВИЛЬНО:

Emp.objects.prefetch_related(Prefetch("roles_name__cur_id__doc_id", Docs.objects.filter(~Q(progress__status='D') | ~Q(update_date__gte=F('progress__date_update')) | ~ Q(progress__date_update__gte=(date.today() + (timedelta(days=1) * F('date_per')))))))
Вернуться на верх