我正在处理会员申请。我想做一个会员提醒。(在一段时间内成为成员,在另一时间段内不是成员)。
目前,我正在使用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)
我想知道我只能通过使用 django ORM(过滤器、排除、注释、不同......)来做到这一点?
在此先感谢您的帮助
更新
事实上,我的模型有点复杂。我也有报纸外键。
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)
我认为这是 Ghislain Leveque 给出的答案的更详细版本,这对我来说也很有效。
感谢 S.Lott 和 KillianDS 提供了非常有价值的答案,很抱歉问题不是很清楚 :)