入会申し込みをしています。メンバーシップのリマインダーを作成したいと思います。(別の期間のメンバーではない期間のメンバー)。
現在、私は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(filter、exclude、annotate、distinct ...)を使用することによってのみそれを実行できることを知りたいですか?
よろしくお願いします
アップデート
実際、私のモデルはもう少し複雑です。新聞の外部キーもあります。
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に感謝し、あまり明確でない質問をしてすみません:)