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, но может не работать с другими БД (не подтверждено).

Вернуться на верх