Django Фильтр по значению внешнего ключа
Предположим, у меня есть две модели
class DocumentType(BaseModel):
name = models.CharField(max_length=128)
code = models.CharField(max_length=128)
exp_days = models.PositiveIntegerField("Remind me before (Days)", blank=True, null=True)
def __str__(self):
return str(self.name)
class EmployeeDocument(BaseModel):
type = models.ForeignKey("masters.DocumentType", on_delete=models.PROTECT)
date_of_expiry = models.DateField(blank=True, null=True)
attachment = models.FileField(blank=True, null=True)
def __str__(self):
return str(self.employee)
Мне нужно получить документы, срок действия которых истекает в ближайшие {exp_days}, указанные в типе.
documents = Document.objects.filter(date_of_expiry__lte=today+timedelta(days=30))
Приведенный выше фильтр вернет документы, срок действия которых истекает в ближайшие 30 дней. Но как применить точно такое же условие
Вы можете использовать F() объект, который представляет значение поля модели. поэтому для ссылки exp_days
из связанной модели вы можете использовать F('type__exp_days')
В ответе от Lutz Prechelt показано, как переместить выражение F() за пределы timedelta.
Вот измененный код
from django.db.models import F
documents = Document.objects.filter(date_of_expiry__lte=today+timedelta(days=1)*F('type__exp_days'))
Как упоминалось здесь, это будет работать с PostgreSQL, но может не работать с другими БД (не подтверждено).