1

入会申し込みをしています。メンバーシップのリマインダーを作成したいと思います。(別の期間のメンバーではない期間のメンバー)。

現在、私は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に感謝し、あまり明確でない質問をしてすみません:)

4

3 に答える 3

6

2番目の式を否定して、同じフィルターに入れるだけではありませんか?したがって、!(a&b)のようなものがあります。これは(!a)|(!b)に等しく、この場合は次のようになります。

result = Member.objects.filter(membership__start_date__lte=dt1, membership__end_date__gte=dt1, ~Q(membership__start_date__lte=dt2) | ~Q(membership__end_date__gte=dt2))

ちなみに、単純なandingおよび基本的なルックアップでは、最初の2つのルックアップパラメーターで示したように、Qオブジェクトは必要ありません。Andingは、複数の引数を渡すだけで発生します。ルックアップを否定およびORするためにQオブジェクトが必要です。

于 2010-08-02T09:53:03.083 に答える
3

リレーショナルデータベーステーブル、定義上、セットです。セット-where not existsSQLにあり、これはexcludeDjangoのORMにあります。

(テストなしで)これを行っているようです。

result = Member.objects.filter(
    Q(membership__start_date__lte=dt1) & Q(membership__end_date__gte=dt1)
).exclude(
    Q(membership__start_date__lte=dt2) & Q(membership__end_date__gte=dt2)
)
于 2010-08-02T10:14:09.567 に答える
1

試してみてください :

result = Member.objects.\
    filter(
        membership__start_date__lte = dt1,
        membership__end_date__gte=dt1).\
    exclude(
        pk__in = \
            Member.objects.filter(
                membership__start_date__lte = dt2,
                membership__end_date__gte = dt2).\
    values_list('pk')
于 2010-08-02T09:55:45.027 に答える