【问题标题】:How to negate a queryset function in django?如何否定 django 中的查询集函数?
【发布时间】: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......

也许在一些简单的条件下我应该选择第一个解决方案,而在最后一个解决方案中使用一些非常复杂的解决方案?

感谢您的建议!

编辑:我更改了第一个示例以使其更明显我不是在寻找排除功能。

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    您可以在活动方法中使用过期的查询集:

    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.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-12
      • 2011-11-13
      • 1970-01-01
      • 2016-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多