gpt4 book ai didi

python - 如何用 django ORM 模仿 Python 集?

转载 作者:太空宇宙 更新时间:2023-11-04 07:04:10 25 4
gpt4 key购买 nike

我正在处理成员(member)申请。我想做一个成员(member)提醒。 (一段时间内的成员(member),另一段时间的非成员(member))。

目前,我正在使用 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 提供了非常有值(value)的答案,对于不太清楚的问题深表歉意:)

最佳答案

不就是把第二个表达式取反,放在同一个过滤器里吗?所以你有类似 !(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 和基本查找,您不需要 Q 对象,就像我用前两个查找参数展示的那样。 Anding 仅通过传递多个参数发生,需要 Q 对象来否定和 OR'ing 查找。

关于python - 如何用 django ORM 模仿 Python 集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3386599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com