【发布时间】:2020-10-17 20:34:20
【问题描述】:
我在 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)
?但这看起来真的很丑陋和hacky......
也许在一些简单的条件下我应该选择第一个解决方案,而在最后一个解决方案中使用一些非常复杂的解决方案?
感谢您的建议!
编辑:我更改了第一个示例以使其更明显我不是在寻找排除功能。
【问题讨论】: