Я работаю над заявкой на членство. Я хотел бы сделать напоминание о членстве. (участник в течение периода времени, который не является членом в течение другого периода времени).
В настоящее время я использую set
для выполнения этого расчета. Смотрите код ниже.
class Member(models.Model):
...
class Membership(models.Model):
member = models.ForeignKey(Member, verbose_name=_("Member"))
start_date = models.DateField(_("Start date"))
end_date = models.DateField(_("End date"))
x = Member.objects.filter(Q(membership__start_date__lte=dt1) & Q(membership__end_date__gte=dt1))
y = Member.objects.filter(Q(membership__start_date__lte=dt2) & Q(membership__end_date__gte=dt2))
result = set(x) - set(y)
Я хотел бы знать, что могу сделать это только с помощью ORM django (фильтр, исключить, аннотировать, отличить ...)?
Заранее спасибо за помощь
UPDATE
На самом деле, моя модель немного сложнее. У меня также есть газета внешнего ключа.
class Member(models.Model):
...
class Newspaper(models.Model):
...
class Membership(models.Model):
member = models.ForeignKey(Member, verbose_name=_("Member"))
start_date = models.DateField(_("Start date"))
end_date = models.DateField(_("End date"))
newspaper = models.ForeignKey(Newspaper)
Я хочу получить напоминание для данной газеты. В этом случае рабочий запрос
sin = models.Membership.objects.filter(start_date__lte=dt1,
end_date__gte=dt1,
newspaper__id=2)
sout = models.Membership.objects.filter(start_date__lte=dt2,
end_date__gte=dt2,
newspaper__id=2)
result = models.Member.objects.filter(membership__in=sin).exclude(membership__in=sout)
Я думаю, что это более подробный вариант ответа, данный Гисленом Левеке, который также хорошо работает для меня.
Спасибо S.Lott и KillianDS за очень ценные ответы и извините за не очень ясный вопрос:)