Django: Фильтр на основе даты начала и даты окончания иностранного ключа
У меня есть следующие две модели:
class ParentModel(models.model):
name = models.CharField("Name", max_length = 256, blank = True)
start_date = models.DateField(blank = True, null = True)
end_date = models.DateField(blank = True, null = True)
class ChildModel(models.model):
name = models.CharField("Name", max_length = 256, blank = True)
parent_model = models.ForeignKey(ParentModel, blank = True, null = True, on_delete=models.SET_NULL)
start_date = models.DateField(blank = True, null = True)
end_date = models.DateField(blank = True, null = True)
Теперь я хочу отфильтровать все дочерние модели, диапазон дат которых не входит в диапазон дат связанной родительской модели.
Код, который я пробовал:
import pandas as pd
child_models = ChildModel.objects.filter(start_date__lte=input_end_date, end_date__gte=input_start_date)
exceeding_child_models = []
for child_model in child_models:
date_range = pd.date_range(start=child_model.start_date, end=child_model.end_date)
if child_model.start_date not in date_range or child_model.end_date not in date_range:
exceeding_child_models.append(child_model)
Как я могу сделать это, используя Django ORM в одном запросе?
Two intervals [s1, e1] and [s2, e2] do not overlap if s1 > e2 or s2 > e1.
Таким образом, мы можем проверить это с помощью:
from django.db.models import F, Q
ChildModel.objects.filter(
Q(start_date__gt=F('parent_model__end_date')) |
Q(end_date__lt=F('parent_model__start_date'))
)