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)ЕСЛИ ДОКУМЕНТ ОБНОВЛЕН, ТО НЕОБХОДИМО ПЕРЕДАТЬ ЕГО
- ЕСЛИ ДАТА ИСТЕКЛА ("date_per "+ ДАТА ПРОХОЖДЕНИЯ)<СЕЙЧАС ТО НЕОБХОДИМО ПРОЙТИ ЭТО
У МЕНЯ ЕСТЬ ЗАПРОС, КОТОРЫЙ ВЫВОДИТ ВСЕ ДОКУМЕНТЫ РОЛИ И УЧЕБНОЙ ПРОГРАММЫ, НАЗНАЧЕННЫЕ ПОЛЬЗОВАТЕЛЮ, НО КАК ОТОБРАЗИТЬ ЭТИ ДОКУМЕНТЫ В СООТВЕТСТВИИ С ЭТИМИ ТРЕМЯ КРИТЕРИЯМИ?
МОЖНО ЛИ ОТФИЛЬТРОВАТЬ ОТФИЛЬТРОВАННУЮ МОДЕЛЬ?
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')))))))