如何解决如何在Django中取消queryset函数?
我在Django 3.1中有这个查询集
class AuthenticationQuerySet(InheritanceQuerySet):
def expired(self):
return self.filter(
date_created__lt=timezone.localtime() - self.model.ACTIVE_THRESHOLD
)
def active(self):
return self.filter(status__in=["PENDING"]).exclude(
date_created__lt=timezone.localtime() - self.model.ACTIVE_THRESHOLD
)
请注意,我在排除函数中使用了相同的条件。 我这样做是因为无法找到更简单的解决方案。但是感觉应该有一种方法可以否定查询集函数过滤的内容吗?
我想像的和感觉更自然的是类似的东西
class AuthenticationQuerySet(InheritanceQuerySet):
def expired(self):
return self.filter(
date_created__lt=timezone.localtime() - self.model.ACTIVE_THRESHOLD
)
def active(self):
return self.filter(status__in=["PENDING"]).exclude(self.expired)
这样可能吗?
或者我应该选择类似的东西
class AuthenticationQuerySet(InheritanceQuerySet):
def expired(self):
return self.filter(self._expired_condition)
def active(self):
return self.filter(status__in=["PENDING"]).exclude(self._expired_condition)
@property
def _expired_condition(self):
return Q(date_created__lt=timezone.localtime() - self.model.ACTIVE_THRESHOLD)
?但这看起来确实很丑陋而且很笨拙...
也许有一个简单的条件,我应该去第一个解决方案,而有一个非常复杂的问题,才是最后一个解决方案?
感谢您的建议!
编辑:我更改了第一个示例,以使其更加明显,我不是在寻找排除函数。
解决方法
您可以在活动方法中使用过期的查询集:
def active(self):
return self.filter(status__in=["PENDING"])
.exclude(pk__in=self.expired().values_list('pk',flat=True))
或者,您可以为date_created字段定义一个自定义的__expired查找,然后在过期的活动方法“ date_created__expired”中使用它。 Docs。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。